2016-06-30 121 views
4

我有我的组件里面像这样的代码:测试抓承诺,AngularJS

p.a().then(function(x) { 
    vm.x = x; 
    return p.b(); 
}).then(function(y) { 
    if (!y) { 
    return $q.reject(new Error('My Error')); 
    } 
    vm.y = y; 
    return y; 
}).catch(function(error) { 
    log.error(error); 
}); 

我能够测试的成功案例精:

it('is successful', function(done) { 
    spyOn(p, 'a').and.returnValue($q.resolve('x')); 
    spyOn(p, 'b').and.returnValue($q.resolve('y')); 

    $ctrl = $componentController('myComponent', { 
    $scope: $rootScope.$new() 
    }); 

    p.a().then(function() { 
    expect($ctrl.x).toEqual('x'); 
    return p.b(); 
    }).then(function() { 
    expect($ctrl.y).toEqual('y'); 
    done(); 
    }); 

    $timeout.flush(); 
}); 

但我不能测试catch,并断言错误:

it('fails', function(done) { 
    spyOn(p, 'a').and.returnValue($q.resolve()); 
    spyOn(p, 'b').and.returnValue($q.resolve()); 

    $ctrl = $componentController('myComponent', { 
    $scope: $rootScope.$new() 
    }); 

    p.a().then(function() { 
    return p.b(); 
    }).catch(function(error) { 
    expect(error).toEqual(new Error('My Error')); 
    done(); 
    }); 

    $timeout.flush(); 
}); 

所有当我运行测试中,我得到的是:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

这意味着catch甚至没有运行(我试图记录一些东西来仔细检查)。

任何想法我做错了什么?

+0

我不知道你正试图在这里做。为什么大家还不你调用控制器'$ ctrl'上的任何函数吗?你在测试什么?测试中的代码? – Sonata

+0

@Sonata,你是什么意思?我调用'p.a()'和'p.b()'都返回promise,解决后我在控制器中设置了一些数据,这就是我测试的'vm === $ ctrl' – jefujire

回答

0

请考虑使用$ rootScope而不是使用jasmine done功能。 购买这样的角度自动运行的承诺

记得把下面的代码在测试中注入$ rootScope:

var $rootScope; 
    beforeEach(inject(function(_$rootScope_) { 
     $rootScope=_$rootScope_.$new(); 
    }));