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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在AngularJS单元测试中模拟模块依赖性相关的知识,希望对你有一定的参考价值。

我有一个带有许多模块的角度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中,它指出了angular docs mock模块如果传递了一个对象文字,每个键值对将通过$ provide.value在模块上注册,键是与值相关联的字符串名称(或标记)注射器。

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

答案

通过调用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();
  });
});

没有必要模拟依赖模块,只需依赖依赖服务。

以上是关于在AngularJS单元测试中模拟模块依赖性的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 RequireJS 中模拟单元测试的依赖项?

如何使用 ES6 模块模拟单元测试的依赖关系

在 AngularJS 单元测试中模拟 $modal

如何在 AngularJS 单元测试中模拟 $window.location.replace?

如何在 AngularJS 中访问 c​​ookie?