我有一个角度项目,其中包含多个模块,用于分离项目的逻辑。显然,很多这些模块都依赖于项目中定义的其他模块。
作为一个例子,我有一个名为' 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'。
有没有办法阻止"真实"该模块的版本作为依赖项加载而是加载"空"我可以在以后添加模拟服务/控制器/等的依赖模块的版本吗?
答案 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
。