gpt4 book ai didi

javascript - 在angularjs中对异步服务进行单元测试

转载 作者:可可西里 更新时间:2023-11-01 01:21:56 26 4
gpt4 key购买 nike

我正在尝试对具有异步方法但运气不佳的服务进行单元测试。

我尝试通过使用 angularjs 中的 $q 支持来实现 promise 。

如有任何帮助,我们将不胜感激。

http://jsfiddle.net/9pBze/37/

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 提供的 mock 使我们能够轻松地模拟耗时(使用 $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/

关于javascript - 在angularjs中对异步服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15477370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com