AngularJS单元测试。 HttpBackend

时间:2014-06-11 08:52:41

标签: angularjs unit-testing httpbackend

我有AngularJS应用程序,其单元测试覆盖它。我在应用程序的.run部分添加了一个http请求,用于检查用户身份验证。现在大约60%的测试失败了,因为他们发现了'意外的http请求'。甚至指令测试都失败了。如何避免在测试中运行此请求?如何在所有测试中轻松模拟此请求?我试图不将httpBackend.expect('GET', 'URL')放到每个测试中 - 这太过分了。

使用Jasmine + Karma进行测试

感谢。如果需要,我可以提供更多细节。

2 个答案:

答案 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测试框架一起提供。