1

我有一个 Angular 项目,其中包含多个用于分离项目逻辑的模块。显然,这些模块中有很多依赖于项目中定义的其他模块。

例如,我有一个名为“myapp.shared.mixpanel”的模块,其中包含一个名为 mixpanelService 的服务,用于发送跟踪事件。还有另一个名为“myapp.feature”的模块依赖于“myapp.shared.mixpanel”,因此它可以访问mixpanelService。

angular.module('myapp.feature', ['myapp.shared.mixpanel']);

当我在“myapp.feature”模块中测试控制器时,我加载了模块:

angular.mock.module('myapp.feature');

但这依赖于“myapp.shared.mixpanel”。

有没有办法阻止这个模块的“真实”版本作为依赖项加载,而是加载依赖模块的“空”版本,我可以稍后添加模拟服务/控制器/等?

4

2 回答 2

1

使用$provide覆盖方法。

例如,我有一个名为“myapp.shared.mixpanel”的模块,其中包含一个名为mixpanelService的服务,用于发送跟踪事件。还有另一个名为“myapp.feature”的模块依赖于“myapp.shared.mixpanel”,因此它可以访问mixpanelService

在您的控制器测试(中的控制器myapp.feature)中,您将执行以下操作:

var $scope, mixPanelService;

beforeEach(function () {
  mixPanelService = {};

  module('myapp.feature', function ($provide) {
    // Here we are $providing a value of the same name to our current module. This is equivalent to the module.config method.
    $provide.value('mixPanelService', mixPanelService);
  });

  inject(function ($controller, $injector) {
    $scope = $injector.get('$rootScope').$new();
    mixPanelService = $injector.get('mixPanelService');       

    $controller('yourController', {
      $scope: $scope
      mixPanelService: mixPanelService
    });
  });

  // Add the required methods to mixPanelService (here I'm using sinon.stub())

  mixPanelService.someMethodMyControllerIsUsing = sinon.stub();
});

现在您不必担心损坏的依赖关系,也不必担心应该在另一个独立的单元测试中测试的实现细节。

mixPanelService被存根并在您的模块中可用,并且您不必在与它无关.shared.mixpanel的规范套件中实例化。

于 2015-07-18T10:33:42.247 回答
0

在 Angular 中,您可以覆盖以前注册的同名模块(请参阅创建与检索)。所以基本上你可以在你的测试中用空的覆盖你的依赖模块:

angular.module('myapp.shared.mixpanel', []);
angular.mock.module('myapp.feature'); 
于 2015-07-16T15:28:09.800 回答