我有一个有许多模块的角1.5项目,每个模块可能依赖于其他模块。试着进行单元测试,比如控制器,它是模块的一部分,我会像这样导入模块:
angular.mock.module('SaidModule');...then在需要时提供并注入其服务。
问题是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来定义一个新模块,而这个模块恰好覆盖了实际的模块。不过,这个解决方案也建议在这里模拟模块依赖项。
在角文档中,如果传递了一个对象文本,则可以看到角文档模拟模块,每个键值对将通过$provide.value在模块上注册,键是字符串名(或令牌),以与注入器上的值相关联。
因此,在我看来,解决方案似乎是以某种方式使用angular.mock.module来覆盖依赖模块,但到目前为止,我还没有找到解决方案。任何帮助都很感激
发布于 2017-04-28 00:29:13
通过调用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();
});
});不需要模拟依赖模块,只需要模拟依赖服务。
https://stackoverflow.com/questions/43664305
复制相似问题