gpt4 book ai didi

unit-testing - Angularjs 如何对依赖于另一个有 promise 的服务的服务进行单元测试?

转载 作者:行者123 更新时间:2023-12-03 07:47:14 25 4
gpt4 key购买 nike

如何测试依赖于另一个服务的服务。我目前在此实现中遇到 Service1Provider not found 错误。如何正确注入(inject) Service1 以便对 Service2 进行单元测试?感谢您提供任何提示或技巧。

jsfiddle gist

!function(ng){
'use strict';

var module = ng.module('foo.services', []);

(function($ng, $module) {
function Service($q) {

return {
bar: function(a,b,c){

var baz = a+b+c;
return function(d,e,f){

var deferred = $q.defer();
if(baz > 0){
deferred.resolve({result: baz + d + e + f });
} else {
deferred.reject({ err: 'baz was <= 0'})
}
return deferred.promise;

}
}
};
}

$module.factory("Service1", ['$q', Service]);

})(ng, module);

(function($ng, $module) {
function Service(Service1) {

function doSomething(){

var result;
var whatever = Service1.bar(5,6,7);

var promise = whatever(8,9,10);
promise.then(function(data){

result = data.result;
//data.result should be 45 here
}, function(err){

});

return result;
}

return {
bam:doSomething
};
}

$module.factory("Service2", ["Service1", Service]);

})(ng, module);
}(angular);


var myApp = angular.module('myApp',['foo.services']);

最佳答案

如果您只是测试 Service2,那么您应该尝试消除测试中对 Service1 的任何依赖。您的测试可能类似于:

module('foo.services', function($provide) {
$provide.value('Service1', MockService1());
});

无论何时注入(inject),这都会给出函数 MockService1 的返回值,而不是实际使用该服务。

然后你让 MockService1 函数返回具有相同函数的实际服务的骨架。在您的测试中,您可以通过执行以下操作来等待 promise 得到解决:

bar: function(...) {
var def = $q.defer();
$timeout(function() {
def.resolve('test');
});
return def.promise;
}

// This is in your test
bar.then( /* .... some tests */ );
// This executes the timeout and therefor the resolve
$rootScope.$digest();
$timeout.flush();

希望这有帮助

关于unit-testing - Angularjs 如何对依赖于另一个有 promise 的服务的服务进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17104749/

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