Dig*_*oug 5 unit-testing jasmine angularjs karma-runner karma-jasmine
在我的app.config我使用一个名为ui-router-extras FutureStates的服务来动态地从REST调用的结果创建状态.其中一个副作用是,当我的测试运行时,由于我在所有测试中加载我的主应用程序模块,所有测试都调用该服务,因此所有测试都失败了
Error: Unexpected request: GET /api/v1/config
No more request expected
Run Code Online (Sandbox Code Playgroud)
我可以将以下内容添加到我的测试套件中,它修复了问题,使用后端注册此调用以便它可以预期.
beforeEach(inject(function(_$httpBackend_){
_$httpBackend_.whenGET(/\/api\/v1\/config.*/).respond([]);
}));
Run Code Online (Sandbox Code Playgroud)
问题是这需要添加到每个测试套件中,在我的模块化应用程序中有很多湿代码.我正在寻找的是一种为所有测试全局定义此期望的方法(在业力全局文件中,或者我甚至可以选择服务/单行导入到我的套件中)或者如果我的测试设置或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([]);
}));
Run Code Online (Sandbox Code Playgroud)
它失败,Error: Injector already created, can not register a module!因为在我的个人测试套件,我打电话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([]);
});
Run Code Online (Sandbox Code Playgroud)
这不会产生额外的错误,但也无法解决Unexpected request问题.
有没有办法处理所有测试的期望,或者如果这表明我的测试结构设置不好,那么更好地构建我的代码/测试的方法?
对于我来说,我不包括主服务模块,而是对它进行模拟,类似于(对于我来说,我将其包含在“文件”中的 karma.conf 中):
angular.module('some.service', []).service('MainService', function() {
this.APP_HOST = 'localhost';
this.APP_PORT = 8000;
});
Run Code Online (Sandbox Code Playgroud)
然后,在全局 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
});
}));
Run Code Online (Sandbox Code Playgroud)
并将定义应该如何嘲笑它:
function mockHttpSuccessfulRequest() {
$httpBackend
.expectGET(baseUrl + '/api/surveys')
.respond({
surveys: [{
something: false,
date: '2015-03-11T08:28:58.765Z'
}]
});
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以在测试套件之前定义此模拟:
beforeEach(mockHttpSuccessfulRequest);
而且你可以自由地检查你想要的一切。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |