2012-10-23 6 views
5

Ich versuche, einen AngularJS-Controller mit einer Jasmine-Einheitstestspezifikationsdatei zu testen. Mein Ansatz ist in dem folgenden Test $ httpBacked, zu verwenden:

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); 
    }); 
}); 

ich eingeführt, um das erwarten (true) .toBe (true) nur um den Test zu erhalten auszuführen und scheitern, auch wenn es nicht die Winkel berührt Regler. Wenn ich versuche ich den Test mit Jasmin-Headless-Webkit zu laufen, erhalte ich folgende Fehlermeldung:

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 

Gibt es Hinweise, wie ich diesen Fehler korrigieren und den triviale Test machen ausführen?

Antwort

1

Ich glaube, das liegt daran, dass Sie den falschen Dienst injizieren. Es weiß nicht, was $_httpBackend_ ist. Sie sollten in der Lage sein, nur dies zu tun:

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

Wenn Sie einmal einen Verweis auf die $httpBackend Service erhalten möchten und speichern, die als $httpBackend, ghiden's answer ist der Weg zu gehen.

+0

Dieses Problem behoben, danke! – oxirane

+4

Das einzige Problem hier war ein Tippfehler. Es sollte \ _ $ httpBackend \ _, nicht $ _httpBackend_ sein. Die folgende Antwort ist dieser vorzuziehen. – user553086

+0

@RichardMorgan Sie haben Recht. Ich habe meine Antwort aktualisiert. +1 zu ghiden – dnc253

30

Das Einfügen von Servicenamen mit Unterstrichen hat einige Vorteile.

Aus Ihrem Code kann ich sehen, dass Sie wahrscheinlich den Verweis auf $ httpBackend speichern wollten. So wolltest du machen. Die Platzierung des Unterstrichs war einmalig.

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

Angular ist intelligent genug, um Unterstrichen zu entfernen und gibt httpBackend $ zurück zu Ihnen, und Sie können es auf Ihre eigenen $ httpBackend speichern.

+2

Dies ist die Antwort, die als markiert werden sollte richtig, sonst können Sie den Dienst nicht mit dem vertrauten Namen "$ httpBackend" in Ihren Tests verwenden. –

Verwandte Themen