如何测试依赖于其他服务的服务。我目前在此实现中找不到Service1Provider错误。如何正确注入Service1以便我可以对Service2进行单元测试?感谢任何提示或技巧。
!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']);
答案 0 :(得分:1)
如果您只是测试Service2,那么您应该尝试消除测试中对Service1的任何依赖。你的测试可能有类似的东西:
module('foo.services', function($provide) {
$provide.value('Service1', MockService1());
});
这将从函数MockService1返回值,而不是在注入时实际使用服务。
然后你有MockService1函数返回具有相同功能的实际服务的骨架。在您的测试中,您可以通过执行以下操作等待承诺得到解决:
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();
希望这有帮助