web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois une erreur ... demande inattendue: GET / internalapi / quotes

J'ai défini le service suivant dans mon angular app:

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

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

et j'écris les spécifications suivantes pour le tester:

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

});

Chaque fois que j'exécute les tests, le premier test est réussi mais le second test génère l'erreur:

Error: Unexpected request: GET /internalapi/quotes

Qu'est-ce que je fais mal?

MODIFIER:

Il s’est avéré que j’avais configuré Restangular comme si ... RestangularProvider.setBaseUrl("/internalapi");. Mais je simulais des appels à internalapi/quotes. Notez le manque de "/". Une fois que j'ai ajouté la barre oblique /internalapi/quotes Tout était bien :)

55
Simon Lomax

Vous devez dire à $ httpBackend de s’attendre à une requête 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();
    }));

});

Sinon, vous pouvez mettre votre respond() sur votre expectGET(). Je préfère mettre mes instructions whenGET() dans un beforeEach() de cette façon, je n'ai pas à définir la réponse dans chaque test.

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

        ms.retrieveQuotes();
        $httpBackend.flush(); 
56
Jonathan Palumbo

J'ai eu le même problème que vous. Ma solution consistait à ajouter un "/" au début du paramètre URL du fichier .expectGET. En utilisant votre exemple:

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

Bonne chance

17
gronnbeck