AngularJS测试错误:未知提供者:$ _httpBackend_Provider < - $ _httpBackend_

oxi*_*ane 5 jasmine angularjs

我试图用Jasmine单元测试规范文件测试AngularJS控制器.我的方法是使用$ httpBacked,在以下测试中:

describe('SubmissionsController', function() {
    var minimal_mock_response = [ { id: 1 } ]; 
    var scope, routeParams, $httpBackend; 

    beforeEach(module('submissionServices'));

    beforeEach(inject(function($_httpBackend_, $rootScope) {
        scope = $rootScope.$new();  
        $httpBackend = $_httpBackend_;
        $httpBackend.expectGET('/submissions').respond(minimal_mock_response);
        routeParams = {};
    }));

    it('passes a trivial test', function() {
        expect(true).toBe(true);
    });
});
Run Code Online (Sandbox Code Playgroud)

我插入expect(true).toBe(true)只是为了让测试执行并失败,即使它没有触及角度控制器.当II尝试使用jasmine-headless-webkit运行测试时,我收到以下错误:

jasmine-headless-webkit spec/javascripts/SubmissionsControllerSpec.js

Running Jasmine specs...
F
FAIL: 1 test, 1 failure, 0.011 secs.

Submissions controllers SubmissionsController passes a trivial test.     (XXX/spec/javascripts/SubmissionsControllerSpec.js:18)
Error: Unknown provider: $_httpBackend_Provider <- $_httpBackend_

Test ordering seed: --seed 9254 
Run Code Online (Sandbox Code Playgroud)

是否有任何关于如何纠正此错误并使琐碎的测试执行的提示?

ghi*_*den 30

用下划线括起服务名称有一些好处.

从您的代码中,我可以看到您可能想要保存对$ httpBackend的引用.这就是你想要做的.下划线的位置是一次性的.

beforeEach(inject(function(_$httpBackend_, $rootScope) {
    scope = $rootScope.$new();  
    $httpBackend = _$httpBackend_;
    ...
Run Code Online (Sandbox Code Playgroud)

Angular足够智能删除下划线并将$ httpBackend返回给您,您可以将其保存到您自己的$ httpBackend.

  • 这是应该标记为正确的答案,否则您将无法在测试中使用熟悉的名称"$ httpBackend"来使用该服务. (2认同)

dnc*_*253 1

我相信这是因为您注入了错误的服务。它不知道$_httpBackend_是什么。你应该能够这样做:

beforeEach(inject(function($httpBackend, $rootScope) {
    scope = $rootScope.$new();  
    $httpBackend.expectGET('/submissions').respond(minimal_mock_response);
    routeParams = {};
}));
Run Code Online (Sandbox Code Playgroud)

如果您想获得一次对该服务的引用$httpBackend并将其存储为$httpBackendghiden 的答案就是正确的选择。

  • 这里唯一的问题是一个拼写错误。它应该是\_$httpBackend\_,而不是$_httpBackend_。下面的答案比这个更好。 (4认同)