在我的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);
你可以免费检查你想要的一切.