我正在学习AngularJS。我正在努力学习各种概念,包括承诺。通常,我会使用回调。现在我正在尝试使用promises,我正试图弄清楚如何在这个新世界中编写测试。这时,我有:
describe('myModule', function() {
beforeEach(function() {
module('myModule');
});
describe('myService', function () {
var myService = null;
beforeEach(inject(function (myService) {
myService = myService;
}));
it('should do my bidding', function () {
myService.myFunction().then(
function() { expect(true).toBe(true); },
function() { expect(false).toBe(false); }
);
});
});
});
myService看起来像这样:
myApp.factory('myService', ['$q', function($q) {
return {
myFunction: function() {
var defer = $q.defer();
defer.resolve();
return defer.promise;
}
};
}]);
基本上,此服务始终可以解决。但是,我无法让我的测试失败。即使我将第一个expect
更改为false
。我看到一个日志条目说:
log: Spec 'myModule myService should do my bidding' has no expectations.
就像then
中的断言没有执行一样。我误解了什么?
由于
答案 0 :(得分:1)
要测试异步代码,您必须在done
函数中接受it
参数,并在测试真正完成时调用它。
您还必须致电$rootScope.$digest()
来调用then
回调。
因此,测试至少应该是这样的:
it('should do my bidding', function(done) {
myService.myFunction().then(
function() { expect(true).toBe(true); },
function() { expect(false).toBe(false); }
).finally(function() {
done();
});
$rootScope.$digest();
});
示例Plunker: http://plnkr.co/edit/h68W1IEpAqe6kJwEG6in?p=preview