Angularjs我如何单独测试依赖于具有承诺的另一个服务的服务?

时间:2013-06-14 08:56:59

标签: unit-testing angularjs jasmine deferred

如何测试依赖于其他服务的服务。我目前在此实现中找不到Service1Provider错误。如何正确注入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']);

1 个答案:

答案 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();

希望这有帮助