Подтвердить что ты не робот

Почему я получаю ошибку... неожиданный запрос: GET/internalapi/quotes

Я определил следующую службу в своем angular приложении:

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

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

и я пишу следующую спецификацию, чтобы протестировать ее:

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

});

Всякий раз, когда я запускаю тесты, первый тест проходит, но второй тест вызывает ошибку:

Error: Unexpected request: GET /internalapi/quotes

Что я делаю неправильно?

EDIT:

Оказалось, что я настроил Restangular так... RestangularProvider.setBaseUrl("/internalapi");. Но я звонил на internalapi/quotes. Обратите внимание на отсутствие "/". Когда я добавил косую черту /internalapi/quotes, все было хорошо:)

4b9b3361

Ответ 1

Вам нужно указать $httpBackend, чтобы ожидать запроса 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();
    }));

});

В качестве альтернативы вы можете поместить свой respond() на свой expectGET(). Я предпочитаю поместить мои операторы whenGET() в beforeEach() таким образом, что мне не нужно определять ответ в каждом тесте.

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

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

Ответ 2

У меня была такая же проблема, как и вы, ребята. Моим решением было добавить '/' в начале URL-параметра .expectGET. Используя ваш пример:

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

Желаем удачи