3

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

jsfiddle 要点

!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']);
4

1 回答 1

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

希望这有帮助

于 2013-10-21T00:11:57.387 回答