Search code examples
angularjsrestangular

Why do I receive error ... unexpected request: GET /internalapi/quotes


I've defined the following service in my angular app :

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

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

and I'm writing the following spec to test it :

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

});

Whenever I run the tests, the first test passes but the second test produces the error :

Error: Unexpected request: GET /internalapi/quotes

What am I doing wrong?

EDIT:

It turned out I'd configured Restangular like so ... RestangularProvider.setBaseUrl("/internalapi");. But I was faking calls to internalapi/quotes. Notice the lack of the "/". Once I added the slash /internalapi/quotes all was good :)


Solution

  • You need to tell $httpBackend to expect a GET request.

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

    Alternatively you can put your respond() on your expectGET(). I prefer to put my whenGET() statements in a beforeEach() that way I do not have to define the response within every test.

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