【发布时间】:2023-04-06 00:55:01
【问题描述】:
我有以下茉莉花测试:
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 应该解决所有未完成的承诺,但不知何故,它在这个测试中没有发生。
如何在这样的测试中触发 Promise 解析?请帮忙!
【问题讨论】:
-
您使用的是哪个版本的 Angular?在 angularJS 1.2 中,promise 符合 A+,并且它们应该在没有显式调用执行
$digest循环的情况下解决。 -
我正在使用 Angular 1.2。好吧,我知道他们应该在摘要循环中解决。但是,他们没有。 :-(
-
好吧,当我在解决后直接调用 $apply 时,它可以工作。但我认为这仍然是奇怪的行为。当我尝试在我的真实单元测试中使用相同的解决方案时(这里介绍的只是用于测试 $apply 行为)它失败了。所以,看来我还是有问题!
-
只有
$scope.$apply工作而不是$timeout?如果没有,我会将其从解决方案中删除。 -
那个铃声响了。
$timeout服务被ngMock模拟(Doh!),并且需要明确调用$timeout.flush(): plnkr.co/edit/Bdh78ZiArbO8vau9ByVJ?p=preview
标签: unit-testing angularjs jasmine promise q