[英]Unit testing an asynchronous service in angularjs
我正在尝试对具有异步方法但没有运气的服务进行单元测试。
我试图通过在angularjs中使用$ q支持来实现承诺。
任何帮助,将不胜感激。
angular.module('myapp', ['myservice']);
angular.module('myservice', []).factory('myservice', function($q) {
var ls = {};
ls.DoIt = function() {
var deferred = $q.defer();
setTimeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
return ls;
});
describe('services', function () {
beforeEach(module('myservice'));
it("should equal 2", inject(function(myservice) {
myservice.DoIt().then(function(returned) {
expect(returned).toEqual(2);
});
}));
});
首先, setTimeout
很难模拟,因此很难测试。 幸运的是,AngularJS周围有一个包装器( $timeout
),它具有相同的作用,但可以很容易地被嘲笑:
ls.DoIt = function() {
var deferred = $q.defer();
$timeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
为$timeout
提供的模拟使我们能够轻松地模拟经过的时间(使用$timeout.flush()
),这意味着我们的测试可以快速运行,而无需真正等待异步事件完成(请注意,生产代码仍在使用异步API!)。
更改后的测试如下所示:
it("should equal 5", inject(function(myservice, $timeout) {
var valueToVerify;
myservice.DoIt().then(function(returned) {
valueToVerify = returned;
});
$timeout.flush();
expect(valueToVerify).toEqual(5);
}));
最后是有效的jsFiddle: http : //jsfiddle.net/v9L9G/1/
它与Angular本身无关,但与Jasmine异步测试有关 。
如果需要setTimeout
使用Angular $timeout
。 如果希望对setTimeout / $ timeout执行有很好的控制,请使用模拟Clock 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.