2013-08-09 15 views
52

Mam zdefiniowane następujące usługi w moim kątowej aplikacji:Dlaczego pojawia się błąd ... nieoczekiwany wniosek: GET/internalapi/cytaty

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

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

i piszę następujące specyfikację, aby go przetestować:

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

}); 

Ilekroć uruchomić testy, pierwszy test zakończy się pomyślnie, ale z drugiej próbie produkuje błąd:

Error: Unexpected request: GET /internalapi/quotes

Co robię źle?

EDIT:

Okazało się, ja tak jak skonfigurowany Restangular ... RestangularProvider.setBaseUrl("/internalapi");. Ale udawałem telefony pod numer internalapi/quotes. Zauważ brak "/". Po dodaniu ukośnika /internalapi/quotes wszystko było dobrze :)

+1

http://stackoverflow.com/questions/14761045/jasmine-tests-angularjs-directives-with-templateurl (nie Zaznacz jako duplikat, ponieważ problemy wydają się różne w pewnym zakresie). –

+1

Pamiętaj, aby oznaczyć pytanie jako rozwiązane, na podstawie Twojej edycji wygląda na to, że zostało naprawione. :) –

+0

Może to być oczywiste dla innych, ale na wypadek, gdyby nie było, te 'expectMETHOD' wywołania oczekują podania pełnego adresu URL, a nie tylko ścieżki, jeśli wywołujesz usługi zewnętrzne. – kungphu

Odpowiedz

54

Musisz powiedzieć $ httpBackend, aby oczekiwać żądania GET.

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

}); 

Alternatywnie można umieścić respond() na expectGET(). Wolę umieszczać moje instrukcje whenGET() w taki sposób, że nie muszę definiować odpowiedzi w każdym teście.

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

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

Niestety, nawet jeśli dodaję '' $ httpBackend.expectGET ("internalapi/quotes"); '' ' , Pojawia się ten sam błąd. Jakieś inne pomysły? –

+0

To powinno zadziałać. Tylko zgadnij, ale spróbuj wstrzyknąć '$ httpBackend' bezpośrednio do twojego testu. Zaktualizuję post, aby to pokazać. –

+0

Nie, to samo. Przyjrzałem się wielu przykładom i zgadzam się, wydaje mi się, że robię to poprawnie, ale niestety nie mam radości. –

17

Miałem ten sam problem co chłopaki. Moim rozwiązaniem było dodanie "/" na początku parametru URL-a .expectGET. Korzystanie przykład:

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

Powodzenia

Powiązane problemy