在AngularJS单元测试中模拟模块依赖项

时间:2017-04-27 17:25:47

标签: javascript angularjs unit-testing module mocking

我有一个带有许多模块的角度1.5项目,每个模块可能依赖于其他模块。尝试单元测试说一个控制器是模块的一部分,我会像这样导入模块:

angular.mock.module('SaidModule');

...然后在需要时提供并注入其服务。

问题在于SaidModule取决于AnotherModule1AnotherModule2AnotherModule3 ....

angular.module('SaidModule', ['AnotherModule1', 'AnotherModule2', 'AnotherModule3']);

当我调用SaidModule时,自然会调用其他模块,这些模块在单元测试方面超出了范围

在单元测试中,我尝试了以下解决方案

angular.module('AnotherModule1',[]);
angular.module('AnotherModule2',[]);
angular.module('AnotherModule3',[]);
angular.mock.module('SaidModule');

虽然对于当前的单元测试,我已经成功地解耦了我已经破坏的依赖项 实际的AnotherModule1,AnotherModule2,AnotherModule3所以当它转向进行单元测试时它们是 甚至在角度项目中都看不到,这似乎对我来说是正确的。因为我使用angular.module来定义一个 恰好覆盖实际模块的新模块。 此处也提出了此解决方案模拟模块依赖性

在角度文档中,它指出了angular docs mock模块 如果传递了对象文字,则每个键值对将通过$ provide.value在模块上注册, 键是与注入器上的值关联的字符串名称(或标记)。

所以在我看来,解决方案是以某种方式使用angular.mock.module以某种方式覆盖依赖 模块但到目前为止我还没有找到解决方案。 任何帮助非常感谢

1 个答案:

答案 0 :(得分:0)

通过致电angular.module('AnotherModule1',[]),您正在重新定义AnotherModule1,我认为这会导致您的下游问题。相反,请为每个相关服务使用$provide。没有必要模拟依赖模块。

假设您的控制器定义如下所示:

angular
  .module('SaidModule', ['AnotherModule1', 'AnotherModule2'])
  .controller('SaidController', [
    '$scope', 
    'AnotherService', 
    function($scope, AnotherService) {
      this.anotherService = AnotherService.helper();
    }
  );

然后您的测试可能如下:

describe('SaidController', function() {
  var controller, scope, AnotherService;

  beforeEach(module('SaidModule'));

  beforeEach(module(function($provide) {
    AnotherService = { helper: function() { return 0; } };
    $provide.value('AnotherService', AnotherService);
  }));

  beforeEach(inject(function($controller, $rootScope) {
    scope = $rootScope.$new();
    controller = $controller('SaidController', {
      $scope: scope
    });
  }));

  it('creates controller', function() {
    expect(controller).not.toBeNull();
  });
});

无需模拟依赖模块,只需依赖依赖服务。