Jasmine AngularJS测试错误:未知提供程序:$\u httpBackend\u提供程序<;-$_httpBackend_

Jasmine AngularJS测试错误:未知提供程序:$\u httpBackend\u提供程序<;-$_httpBackend_,jasmine,angularjs,Jasmine,Angularjs,我试图用Jasmine单元测试规范文件测试AngularJS控制器。我的方法是在以下测试中使用$httpBacked: describe('SubmissionsController', function() { var minimal_mock_response = [ { id: 1 } ]; var scope, routeParams, $httpBackend; beforeEach(module('submissionServices'));

我试图用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);
    });
});
我插入expect(true).toBe(true)只是为了让测试执行并失败,即使它没有触及角度控制器。当我尝试使用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 
jasmine headless webkit spec/javascripts/submissions controllerspec.js
运行茉莉花规格。。。
F
失败:1次测试,1次失败,0.011秒。
提交控制器SubmissionsController通过了一个简单的测试。(XXX/spec/javascripts/SubmissionsControllerSpec.js:18)

错误:未知提供程序:$\u httpBackend\u提供程序我相信这是因为您注入了错误的服务。它不知道
$\uHttpBackend\uHttpBackend
是什么。您应该能够做到这一点:

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

如果您想获得一次对
$httpBackend
服务的引用,并将其存储为
$httpBackend
,这是一种方法。

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

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

beforeEach(inject(function(_$httpBackend_, $rootScope) {
    scope = $rootScope.$new();  
    $httpBackend = _$httpBackend_;
    ...

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

这是应该标记为正确的答案,否则您将无法在测试中使用熟悉的名称“$httpBackend”的服务。这里唯一的问题是输入错误。它应该是u$httpBackend,而不是$\httpBackend。下面的答案比这个更好。@RichardMorgan你说得对。我已经更新了我的答案+1对于ghidenYes,angular injector在$httpBackend中剥离,如果您希望在描述级别使用相同名称的变量availalbe,则需要$httpBackend