我遇到过一个我无法通过测试的情况。如何在angularjs中测试承诺
下面是测试:
it('should accept an fucntion run it immediately', inject(function($rootScope, ready) {
var spy = jasmine.createSpy('ready').andCallFake(function(){
console.log("I'm ready");
});
ready.done(spy);
expect(spy).toHaveBeenCalled();
}));
这里是代码:
angular.module('myApp').factory('ready', function($q, _, $rootScope){
var defer = $q.defer();
//in real case it's actually calling 3rd party code, so no $timeout
_.defer(function(){
$rootScope.$apply(function(){
defer.resolve();
});
});
return {
done: function(fn){
defer.promise.then(fn);
}
};
});
的I'm ready
日志没有出现,但测试还是失败了。所以我认为它只是在jasmine
中处理异步流的问题。但我想不出用茉莉花的runs
和waitsFor
来测试它。
看到这个答案:http://stackoverflow.com/questions/15477370/unit-testing-an-asynchronous-service-in-angularjs –
一个可能的简化:为什么不直接从工厂返回'defer.promise'?然后调用代码可以使用'ready.then(function(){...})',否则你会稍微回到回调地狱。 –
@MichalCharemza那会很好 – jackysee