2012-10-23 31 views
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); 
    }); 
}); 

我插入預期(真).toBe(真)只是爲了讓測試執行和失敗,即使不接觸角控制器。當我我嘗試與茉莉無頭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 

是否有我如何能糾正這一錯誤,使平凡的測試執行任何提示?

回答

1

我相信這是因爲你注射了錯誤的服務。它不知道$_httpBackend_是什麼。你應該能夠只是這樣做:

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

如果你想要去的$httpBackend服務的引用一次,並存儲爲$httpBackendghiden's answer是要走的路。

+0

修復了這個問題,謝謝! – oxirane

+4

這裏唯一的問題是一個錯字。它應該是\ _ $ httpBackend \ _,而不是$ _httpBackend_。下面的答案比這個更好。 – user553086

+0

@RichardMorgan你說得對。我已經更新了我的答案。 +1 to ghiden – dnc253

30

用下劃線括起服務名稱有一些好處。

從你的代碼中,我可以看到你可能想保存對$ httpBackend的引用。這是你想要做的。下劃線的位置是一個。

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

角是足夠聰明,刪除下劃線,並返回$ httpBackend回給你,你可以將它保存到自己的$ httpBackend。

+2

這是應該標記爲的答案正確的,否則你將無法在測試中使用熟悉的名稱「$ httpBackend」來使用服務。 –

相關問題