3

別のサービスに依存するサービスをテストするにはどうすればよいですか。現在、この実装で Service1Provider not found エラーが発生しています。Service2 を単体テストできるように、Service1 を適切に注入するにはどうすればよいですか? ヒントやコツをありがとう。

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 関数が同じ関数を持つ実際のサービスのスケルトンを返すようにします。テストでは、次のようにして 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();

これが役に立ったことを願っています

于 2013-10-21T00:11:57.387 に答える