我有AngularJS应用程序,其单元测试覆盖它。我在应用程序的.run部分添加了一个http请求,用于检查用户身份验证。现在大约60%的测试失败了,因为他们发现了'意外的http请求'。甚至指令测试都失败了。如何避免在测试中运行此请求?如何在所有测试中轻松模拟此请求?我试图不将httpBackend.expect('GET', 'URL')
放到每个测试中 - 这太过分了。
使用Jasmine + Karma进行测试
感谢。如果需要,我可以提供更多细节。
答案 0 :(得分:2)
有几种方法可以做到这一点:
1。)包括Tim Castelijns建议的beforeEach,但是每个spec文件都包括 2.)将beforeEach包含在名为app-mocks.js&的单独文件中。包含在你的karma.conf.js中(我猜你有一个)。
karma.conf.js
files: [
'location/of/app-mocks.js',
'src/app/**/*.js'
],
APP-mocks.js
(function () {
'use strict';
beforeEach(inject(function ($httpBackend) {
$httpBackend.whenGET('blahblahblah.com/cat/:id/food').respond('');
}));
})();
3.。)从核心应用程序中分离出用户身份验证逻辑,并创建$ http包装器服务(建议)。因此,您可以(简化示例):
app.js
angular.module('myApp', ['myApp.services']);
用户service.js
angular.module('myApp.services', [])
.factory('User', function ($http) {
function authenticate() {
// authenticate user
}
return {
authenticate: authenticate
};
});
和您的指令,控制器等相同。这样,您可以单独对所有组件进行单元测试,而不必担心实际上特定于某种功能的交织逻辑。此外,当您执行测试核心应用功能时,您可以模拟或监视您的用户服务。在您的spec文件中,您只会注入模块&您正在测试的功能。因此,您不会注入整个核心应用模块,而是:
测试服务
beforeEach(module('myApp.services'));
测试指令
beforeEach(module('myApp.directives'));
等
注意:当您的应用程序开始变大时,我会考虑根据功能而不是类型来组织您的应用程序组件,如上面的示例所示。
答案 1 :(得分:0)
您可以使用beforeEach块来定义所有测试应该预期的调用
var httpBackend;
beforeEach(inject(function(_$httpBackend_) {
httpBackend = _$httpBackend_;
httpBackend.expect('GET', 'URL').respond('');
}
请注意我添加的.respond('')
,期望通话需要此功能,如果您想知道原因,请参阅the documentation。
此beforeEach
功能随广泛使用的jasmine测试框架一起提供。