Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 测试特定服务时的自定义服务依赖项注入_Angularjs_Unit Testing_Dependency Injection - Fatal编程技术网

Angularjs 测试特定服务时的自定义服务依赖项注入

Angularjs 测试特定服务时的自定义服务依赖项注入,angularjs,unit-testing,dependency-injection,Angularjs,Unit Testing,Dependency Injection,在测试服务时,是否有方法将注入的服务作为特定服务的依赖项覆盖,而不是在解析时覆盖所有服务 我试图将模拟服务MockChild作为依赖项注入另一个服务父级,并使模拟服务依赖于原始服务子级。比如: Parent >> MockChild >> Child 模拟服务将在多个位置使用,因此我想将其从父服务中分离出来,并将其放在自己的文件中 我遇到的问题是无法通过以下方式将MockChild服务注入父服务: var $rootScope, MockChild, Parent;

在测试服务时,是否有方法将注入的服务作为特定服务的依赖项覆盖,而不是在解析时覆盖所有服务

我试图将模拟服务MockChild作为依赖项注入另一个服务父级,并使模拟服务依赖于原始服务子级。比如:

Parent >> MockChild >> Child
模拟服务将在多个位置使用,因此我想将其从父服务中分离出来,并将其放在自己的文件中

我遇到的问题是无法通过以下方式将MockChild服务注入父服务:

var $rootScope, MockChild, Parent;

beforeEach(inject(function(_$rootScope_, _MockChild_, _Parent_) {
  $rootScope = _$rootScope_;
  MockChild = _Child_;
  Parent = _Parent_;
}));
然后稍后使用$PROFECT指示依赖项注入在解析子项时应使用MockChild,通过:

我可以理解,这很可能是由于注入规则在注入时在应用程序范围内最终确定。。。但对我来说,问题是我需要访问MockChild中的Child

在我看来,当使用$controller服务测试控制器时,可以实现本地覆盖,为需要注入的服务提供显式覆盖参数。使用虚构的$service服务的示例如下所示:

beforeEach(inject(function($service, MockChild) {
  Parent = $service('Parent', {
    Child: MockChild
  });
});
我的MockChild服务定义如下所示:

angular.module('myApp')
  .service('MockChild', ['$q', 'Child', function($q, Child) {
    var _children = [ 
      new Child(),
      new Child(),
      new Child()
    ];  

    return {
      all: function() {
        return $q(function(success, error) {
          if(success) {
            success(_children);
          }   
        }); 
      }   
    };  
  }]);
angular.module('myApp')
  .service('Parent', ['$q', 'Child', function($q, Child) {
      var Parent = Parse.Object.extend('Parent');

      Parent.all = function() {
        return $q(function(success, error) {
          var results = cache.get('parents.all');
          if(results) {
            if(success) {
              success(results);
            }   
          } else {
            var result = new Parent();
            result.id = 'parent_id';
            result.getChildren().then(function() {
              success([result]);
            }); 
          }   
        }); 
      };  

      Parent.prototype.getChildren = function() {
        var meeting = this;
        return $q(function(success, error) {
          Child.all().then(function(children) {
            if(success) {
              success(children);
            }   
          }); 
        }); 
      };  

      return Parent;
    }]);
我的父服务看起来是这样的:

angular.module('myApp')
  .service('MockChild', ['$q', 'Child', function($q, Child) {
    var _children = [ 
      new Child(),
      new Child(),
      new Child()
    ];  

    return {
      all: function() {
        return $q(function(success, error) {
          if(success) {
            success(_children);
          }   
        }); 
      }   
    };  
  }]);
angular.module('myApp')
  .service('Parent', ['$q', 'Child', function($q, Child) {
      var Parent = Parse.Object.extend('Parent');

      Parent.all = function() {
        return $q(function(success, error) {
          var results = cache.get('parents.all');
          if(results) {
            if(success) {
              success(results);
            }   
          } else {
            var result = new Parent();
            result.id = 'parent_id';
            result.getChildren().then(function() {
              success([result]);
            }); 
          }   
        }); 
      };  

      Parent.prototype.getChildren = function() {
        var meeting = this;
        return $q(function(success, error) {
          Child.all().then(function(children) {
            if(success) {
              success(children);
            }   
          }); 
        }); 
      };  

      return Parent;
    }]);

在我看来,您的总体测试方法有点问题。当单元测试X时,您真的不需要关心Y。您只需要模拟Y,使其返回X所期望的结果,并只关注X。或者,在测试集成时,您需要避免模拟X或Y,这样您就有了额外的一层确定性,即它们实际上是协同工作的,并且您的模拟是准确的。我不认为这两者的混合会有任何帮助。我可以理解,我可以通过按摩来生成匿名对象,而不是通过new Child创建新的子对象,但总体问题仍然存在;即使我对MockChild中的Child没有依赖关系,我如何将MockChild注入到测试中,然后将其设置为每当依赖关系注入尝试解析Child时使用的服务?