如何在另一个服务中从外部文件注入服务的模拟

Mor*_*los 5 jasmine angularjs

我正在测试服务1取决于另一个服务B.通常这样做的正确方法是$provide在注入A之前使用该对象.但是,我有两个约束:

  • 服务B的模拟存储在另一个文件中,因为我在多个测试中重用它(如后面所示,我只是注册一个新的Angular服务)
  • 我需要在我的测试中的某些点初始化此服务B(设置承诺)

问题是,到目前为止(我正在测试控制器),我能够从我的测试中访问服务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服务,但只是对于普通对象,如果它可以解决这个问题).

use*_*633 3

经过大量环顾四周后,我找到了 Valentyn Shybanov 的答案,解释了如何做到这一点。事实上这很简单。我会把它留在这里给其他迷失的灵魂。

实际上,AngularJS 依赖注入使用“最后获胜”规则。因此,您可以在包含模块和依赖项后在测试中定义您的服务,然后当您正在测试的服务 A 将使用 DI 请求服务 B 时,AngularJS 将提供服务 B 的模拟版本。

所以如果你想模拟“Views”服务。您创建一个包含“Views”服务的“BoardMocks”模块。如果“BoardMocks”包含在“Board”之后,则在测试期间将使用模拟的“Views”服务。

请参阅此处的原始答案: 在单元测试 AngularJS 服务时注入依赖服务