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

angularjs – 模拟Angular和Jasmine中所有套件的全局HTTP请求

发布时间:2020-12-17 18:08:23 所属栏目:安全 来源:网络整理
导读:在我的app.config中,我使用名为 ui-router-extras FutureStates的服务从REST调用的结果中动态创建状态.其中一个副作用是,当我的测试运行时,由于我在所有测试中加载我的主应用程序模块,所有测试都调用该服务,因此所有测试都失败了 Error: Unexpected request:
在我的app.config中,我使用名为 ui-router-extras FutureStates的服务从REST调用的结果中动态创建状态.其中一个副作用是,当我的测试运行时,由于我在所有测试中加载我的主应用程序模块,所有测试都调用该服务,因此所有测试都失败了

Error: Unexpected request: GET /api/v1/config
No more request expected

我可以将以下内容添加到我的测试套件中,它修复了问题,使用后端注册此调用以便它可以预期.

beforeEach(inject(function(_$httpBackend_){
    _$httpBackend_.whenGET(//api/v1/config.*/).respond([]);
}));

问题是这需要添加到每个测试套件中,在我的模块化应用程序中有很多湿代码.我正在寻找的是一种为所有测试全局定义此期望的方法(在业力全局文件中,或者我甚至可以选择服务/单行导入到我的套件中)或者如果我的测试设置或app.config设置效率低下是一种改进方法.

到目前为止我尝试过的

// Defined in a tests-global.js file listed in my karma files array
beforeEach(inject(function(_$httpBackend_){
    _$httpBackend_.whenGET(//api/v1/req_params.*/).respond([]);
}));

失败的错误:Injector已经创建,无法注册模块!因为在我的个人测试套件中,我调用beforeEach(module(‘x’));使用该模块的模块,在inject()之后你不能这样做.

我也试过了

// Defined in a tests-global.js file listed in my karma files array
beforeEach(function() {
    var $injector = angular.injector(['ngMock']);
    $httpBackend = $injector.get('$httpBackend');
    $httpBackend.whenGET(//api/v1/req_params.*/).respond([]);
});

它不会产生其他错误,但也无法解决意外的请求问题.

有没有办法处理所有测试的期望,或者如果这表明我的测试结构设置不好,那么更好地构建我的代码/测试的方法?

解决方法

至于我,我不是包括主服务模块,而是模拟它,类似于(对我来说,我将它包含在“文件”中的karma.conf中):

angular.module('some.service',[]).service('MainService',function() {
    this.APP_HOST = 'localhost';
    this.APP_PORT = 8000;
});

然后,在全局beforeEach中进行测试(请记住,MainService是一个模拟的,而不是真实的):

beforeEach(inject(function(_$httpBackend_,MainService,$rootScope,$controller) {
    $httpBackend = _$httpBackend_;
    MainService.APP_HOST = 'localhost';
    MainService.APP_PORT = '8000';
    baseUrl = '//' + MainService.APP_HOST + ':' + MainService.APP_PORT;
    scope = $rootScope.$new();
    someCtrl = $controller('someCtrl',{
        $scope: scope,MainService: MainService
    });
}));

并将定义如何被嘲笑:

function mockHttpSuccessfulRequest() {
    $httpBackend
        .expectGET(baseUrl + '/api/surveys')
        .respond({
            surveys: [{
                something: false,date: '2015-03-11T08:28:58.765Z'
            }]
        });
}

那么你在测试套装之前定义了这个模拟:

beforeEach(mockHttpSuccessfulRequest);

你可以免费检查你想要的一切.

(编辑:李大同)

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

    推荐文章
      热点阅读