2013-08-09 6 views
52

ich den folgenden Dienst in meinem Winkel App definiert haben:Warum erhalte ich Fehler ... unerwartete Anfrage: GET/internalapi/quotes

services.factory('MyService', ['Restangular', function (Restangular) { 
     return { 
      events : { loading : true }, 

      retrieveQuotes : function() { 
       return Restangular.all('quotes').getList().then(function() { 
        return { hello: 'World' }; 
       }); 
      } 
    }; 
}]); 

und ich schreibe die folgende Spezifikation zu testen:

describe("MyService", function() { 

    beforeEach(module('MyApp')); 
    beforeEach(module("restangular")); 

    var $httpBackend, Restangular, ms; 

    beforeEach(inject(function (_$httpBackend_, _Restangular_, MyService) { 
     ms = MyService; 
     $httpBackend = _$httpBackend_; 
     Restangular = _Restangular_; 
    })); 


    it("retrieveQuotes should be defined", function() { 
     expect(ms.retrieveQuotes).toBeDefined(); 
    }); 

    it("retrieveQuotes should return array of quotes", function() { 

     $httpBackend.whenGET("internalapi/quotes").respond({ hello: 'World' }); 
     ms.retrieveQuotes(); 
     $httpBackend.flush(); 
    }); 

}); 

Immer, wenn ich die Tests ausführen, der erste Test, aber der zweite Test bestanden wird erzeugt den Fehler:

Error: Unexpected request: GET /internalapi/quotes

Was mache ich falsch?

EDIT:

Es stellte sich heraus, dass ich Restangular wie so ... RestangularProvider.setBaseUrl("/internalapi"); konfiguriert hatte. Aber ich habe gefälschte Anrufe an internalapi/quotes. Beachten Sie das Fehlen des "/". Sobald ich den Schrägstrich /internalapi/quotes hinzugefügt hatte, war alles gut :)

+1

http://stackoverflow.com/questions/14761045/jasmine-tests-angularjs-directives-with-templateurl (I als Duplikat nicht Flagge tat, weil die Probleme scheinen bis zu einem gewissen Grad anders zu sein). –

+1

Bitte denken Sie daran, Ihre Frage als gelöst zu markieren, basierend auf Ihrer Bearbeitung sieht es so aus, als wäre sie behoben worden. :) –

+0

Es kann für andere offensichtlich sein, aber falls nicht, erwarten diese 'expectMETHOD'-Aufrufe, dass Sie die vollständige URL übergeben, nicht nur den Pfad, wenn Sie externe Dienste aufrufen. – kungphu

Antwort

54

Sie müssen $ httpBackend sagen, um eine GET-Anfrage zu erwarten.

describe("MyService", function() { 

    beforeEach(module('MyApp')); 
    beforeEach(module("restangular")); 

    var Restangular, ms; 

    beforeEach(inject(function (_Restangular_, MyService) { 
     ms = MyService; 

     Restangular = _Restangular_; 
    })); 


    it("retrieveQuotes should be defined", function() { 
     expect(ms.retrieveQuotes).toBeDefined(); 
    }); 

    it("retrieveQuotes should return array of quotes", inject(function ($httpBackend) { 

     $httpBackend.whenGET("internalapi/quotes").respond({ hello: 'World' }); 

     //expect a get request to "internalapi/quotes" 
     $httpBackend.expectGET("internalapi/quotes"); 

     ms.retrieveQuotes(); 
     $httpBackend.flush(); 
    })); 

}); 

Alternativ können Sie Ihre respond() auf expectGET() setzen. Ich ziehe es vor, meine whenGET() Anweisungen in eine beforeEach() so zu setzen, dass ich die Antwort nicht innerhalb jedes Tests definieren muss.

 //expect a get request to "internalapi/quotes" 
     $httpBackend.expectGET("internalapi/quotes").respond({ hello: 'World' }); 

     ms.retrieveQuotes(); 
     $httpBackend.flush(); 
+3

Leider, selbst wenn ich '' '$ httpBackend.expectGET (" internalapi/quotes ");' '' Ich bekomme den gleichen Fehler. Irgendwelche anderen Ideen? –

+0

Das sollte funktionieren. Versuchen Sie einfach, das '$ httpBackend' direkt in Ihren Test zu injizieren. Ich werde den Beitrag aktualisieren, um dies zu zeigen. –

+0

Nein, dasselbe. Ich habe mir viele Beispiele angesehen und ich stimme zu, ich mache es anscheinend richtig, aber leider keine Freude. –

17

Ich hatte das gleiche Problem wie euch. Meine Lösung bestand darin, am Anfang des URL-Parameters von .expectGET ein '/' hinzuzufügen. Mit Ihrem Beispiel:

$httpBackend.expectGET("/internalapi/quotes").respond({ hello: 'world'}) 

Best of luck

Verwandte Themen