如何对多模块角度产品进行单元测试

时间:2015-07-16 13:14:11

标签: angularjs unit-testing jasmine angular-mock

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

作为一个例子,我有一个名为' 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'。

有没有办法阻止"真实"该模块的版本作为依赖项加载而是加载"空"我可以在以后添加模拟服务/控制器/等的依赖模块的版本吗?

2 个答案:

答案 0 :(得分:0)

在Angular中,您可以使用相同的名称覆盖以前注册的模块(请参阅Creation versus Retrieval)。所以基本上你可以在测试中用空的依赖模块覆盖你的依赖模块:

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

答案 1 :(得分:0)

使用$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已被删除并在您的模块中可用,并且您不必在具有 nothing 的规范套件中实例化.shared.mixpanel