5

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

是否有关于如何纠正此错误并执行微不足道的测试的任何提示?

4

2 回答 2

30

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

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

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

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

于 2013-03-07T02:47:39.490 回答
1

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

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

如果您想获得一次对该$httpBackend服务的引用并将其存储为$httpBackend那么 ghiden 的答案就是要走的路。

于 2012-10-23T22:31:51.967 回答