Почему я получаю ошибку... неожиданный запрос: 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
, все было хорошо:)
Ответы
Ответ 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'})
Желаем удачи