我正在测试服务1取决于另一个服务B.通常这样做的正确方法是$provide在注入A之前使用该对象.但是,我有两个约束:
问题是,到目前为止(我正在测试控制器),我能够从我的测试中访问服务B,我需要注入它.但是要$provide在我的测试中模拟它,我需要在我的测试中访问它,这会产生问题,因为$provide需要在任何之前使用它inject().这是我的测试:
describe('viewsListService', function() {
var viewList,
queryDeferred,
mockViews,
$scope;
beforeEach(module('BoardMocks'));
beforeEach(module('Board'));
beforeEach(inject(function(mockViewsService) {
var query = {};
mockViewsService.init({}, query);
queryDeferred = query.deferred;
mockViews = mockViewsService.mock;
}));
beforeEach(function() {
angular.mock.module('Board', function ($provide) {
$provide.value('Views', mockViews);
});
});
beforeEach(inject(function(viewsListService, $rootScope) {
$scope = $rootScope.$new();
viewList = viewsListService;
// Initialisation of the viewsListService
viewList.init();
queryDeferred.resolve([1]);
$scope.$digest();
}));
describe('getAllViews', function() {
var allViews;
beforeEach(function() {
allViews = viewList.getAllViews();
});
it('should return all the views', function() {
expect(allViews.length).toBe(1);
});
});
});
Run Code Online (Sandbox Code Playgroud)
这给了我一个Error: Injector already created, can not register a module!,指向angular.mock.module调用.
我将我的模拟服务移动到另一个模块,认为它可能会解决问题,想知道注入器是否特定于模块,但它似乎不是(beforeEach(module('Board'));在第一个之后移动inject()并不能解决问题.
你有任何想法让它工作,同时将模拟保存在外部文件中(我很好,没有将它注册为Angular服务,但只是对于普通对象,如果它可以解决这个问题).
经过大量环顾四周后,我找到了 Valentyn Shybanov 的答案,解释了如何做到这一点。事实上这很简单。我会把它留在这里给其他迷失的灵魂。
实际上,AngularJS 依赖注入使用“最后获胜”规则。因此,您可以在包含模块和依赖项后在测试中定义您的服务,然后当您正在测试的服务 A 将使用 DI 请求服务 B 时,AngularJS 将提供服务 B 的模拟版本。
所以如果你想模拟“Views”服务。您创建一个包含“Views”服务的“BoardMocks”模块。如果“BoardMocks”包含在“Board”之后,则在测试期间将使用模拟的“Views”服务。
请参阅此处的原始答案: 在单元测试 AngularJS 服务时注入依赖服务
| 归档时间: |
|
| 查看次数: |
1062 次 |
| 最近记录: |