我有一个带有许多模块的角度1.5项目,每个模块可能依赖于其他模块。尝试单元测试说一个控制器是模块的一部分,我会像这样导入模块:
angular.mock.module('SaidModule');
...然后在需要时提供并注入其服务。
问题在于SaidModule
取决于AnotherModule1
,AnotherModule2
,AnotherModule3
....
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以某种方式覆盖依赖 模块但到目前为止我还没有找到解决方案。 任何帮助非常感谢
答案 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();
});
});
无需模拟依赖模块,只需依赖依赖服务。