我遇到過一個我無法通過測試的情況。如何在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