加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 10:22:40 所属栏目:安全 来源:网络整理
导读:我正在测试服务1取决于另一个服务B.通常这样做的正确方法是在注入A之前使用$provide对象.但是,我有两个约束: 服务B的模拟存储在另一个文件中,因为我在多个测试中重用它(如后面所示,我只是注册一个新的Angular服务) 我需要在我的测试中的某些点初始化此服务B
我正在测试服务1取决于另一个服务B.通常这样做的正确方法是在注入A之前使用$provide对象.但是,我有两个约束:

>服务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);
        });
    });
});

这给了我一个错误:Injector已经创建,无法注册模块!,指向angular.mock.module调用.

我将我的模拟服务移动到另一个模块,认为它可能会解决问题,想知道注入器是否特定于模块,但它似乎不是(移动beforeEach(模块(‘Board’));之后第一个inject()不能解决问题.

你有任何想法让它工作,同时将模拟保存在外部文件中(我很好,没有将它注册为Angular服务,但只是对于普通对象,如果它可以解决这个问题).

经过大量的回顾,我找到了Valentyn Shybanov的答案,解释了如何做到这一点.事实上这很简单.我会留在这里为其他失去灵魂的人.

Actually in AngularJS Dependency Injection uses the ‘last wins’ rule. So you can define your service in your test just after including your module and dependencies,and then when service A that you’re testing will request service B using DI,AngularJS will give mocked version of service B.

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

请在此处查看原始答案:
Injecting dependent services when unit testing AngularJS services

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读