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