【问题标题】:AngularJS testing error: Unknown provider: $_httpBackend_Provider <- $_httpBackend_AngularJS 测试错误:未知提供者:$_httpBackend_Provider <- $_httpBackend_
【发布时间】:2012-10-23 21:39:19
【问题描述】:

我正在尝试使用 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 angularjs


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是应该标记为正确的答案,否则您将无法在测试中使用熟悉的名称“$httpBackend”的服务。
    【解决方案2】:

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

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

    如果您想获得一次对$httpBackend 服务的引用并将其存储为$httpBackend,那么ghiden's answer 是最好的选择。

    【讨论】:

    • 这里唯一的问题是一个错字。它应该是 _$httpBackend_,而不是 $_httpBackend_。下面的答案比这个更可取。
    • @RichardMorgan 你是对的。我已经更新了我的答案。 +1 吉登
    • 是的,角度注入器在 $httpBackend 中剥离了 _,如果你想在 describe 中使用变量,你想拥有它 $httpBackend同名关卡
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2013-02-21
    • 2013-01-25
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多