Unit testing 茉莉花中的角承诺
我有以下茉莉花测试:Unit testing 茉莉花中的角承诺,unit-testing,angularjs,jasmine,promise,q,Unit Testing,Angularjs,Jasmine,Promise,Q,我有以下茉莉花测试: it('should resolve promise', inject(function ($q, $rootScope) { function getPromise(){ var deferred = $q.defer(); setTimeout(function(){ deferred.resolve(true); }, 1000); return deferred.pro
it('should resolve promise', inject(function ($q, $rootScope) {
function getPromise(){
var deferred = $q.defer();
setTimeout(function(){
deferred.resolve(true);
}, 1000);
return deferred.promise;
}
var p = getPromise();
var cb = jasmine.createSpy();
runs(function(){
expect(cb).not.toHaveBeenCalled();
p.then(cb);
$rootScope.$apply();
});
waitsFor(function(){
return cb.callCount == 1;
});
runs(function(){
expect(cb).toHaveBeenCalled();
$rootScope.$apply();
});
}));
我原以为$rootScope.$apply应该解决所有未兑现的承诺,但不知何故,它并没有发生在这个测试中
在这样的测试中,如何触发承诺解析?请帮忙 我认为在您的情况下,
$rootScope.$apply()
调用得太快了。这应该起作用:
函数getPromise(){
var deferred=$q.deferred();
setTimeout(函数(){
延迟。解决(正确);
$rootScope.$apply();
}, 1000);
回报。承诺;
}
更新
您可以使用$timeout.flush()
显式地注入和解析该承诺
it('should resolve promise',inject(函数($q,$timeout,$rootScope){
函数getPromise(){
var deferred=$q.deferred();
$timeout(函数(){
延迟。解决(正确);
}, 1000);
回报。承诺;
}
// ...
$timeout.flush();
// ...
您使用的是angularJS 1.2的哪个版本?对于angularJS 1.2,承诺是A+兼容的,它们应该在不显式调用执行$digest
循环的情况下解析。我使用的是Angular 1.2。我知道它们应该在摘要循环中解析。但是,它们没有:-(好吧,当我在解析后直接调用$apply时,它是有效的。但我认为这仍然是一种奇怪的行为。当我尝试在我的实际单元测试中使用相同的解决方案时(这里给出的解决方案只是为了测试$apply行为)它失败了。所以,似乎我仍然有一个问题!只有$scope.$apply
起作用了,而不是$timeout
?如果没有,我会将它从解决方案中删除。$timeout
服务被ngMock
(Doh!)模拟,并且需要显式调用$timeout.flush()
: