2017-09-04 1 views
0

J'ai besoin de tester un service angulaire interne implémenté sous Angular 1.5.9 avec du jasmin/karma.

Je dois écrire un test qui vérifie que la réponse d'une fonction de service particulière est comme prévu. Pour ce faire, je construis un objet fantôme, en instanciant le service, en appelant la fonction à tester et en utilisant expect().toBe() pour vérifier la valeur retournée.

Malheureusement, le service effectue de nombreux appels à ses propres fonctions, dont beaucoup font d'autres appels en utilisant le service angulaire $http. Il le fait afin de peupler des objets tels que les données de l'utilisateur, les paramètres régionaux et d'autres informations sur le produit sur mesure. Autant dire que je ne suis pas en mesure de refactoriser le service en une meilleure architecture; Je dois simplement construire ce test.

Comme il y a tant d'appels à $http je compte railler toutes les données qu'il demanderait à l'aide d'une série de lignes comme celle-ci:

var mockGetCartData = { "d": null, "message": null }; // at the top of the describe 
$httpBackend.when('GET', /(.*)\/order\/api\/v1\/GetCart/).respond(200, mockGetCartData); // in the beforeEach 

Quand j'appelle la fonction à tester, je fais appel immédiatement $httpBackend.flush() mais, comme le test échoue, je crains que ce que je dois faire est que chaque appel (falsifié) $http soit vidé avant que le prochain soit fait.

Ai-je besoin de faire cela ou est en train de configurer toutes les entrées $httpBackend.when().respond(), en agissant sur la fonction de test, puis en appelant un seul flush() assez? Si cela ne suffit pas, que dois-je faire?

Répondre

1

Vous n'avez pas besoin d'appeler flush() pour chaque requête effectuée car elle vide toutes les demandes en attente.

Voir la Documentation: https://docs.angularjs.org/api/ngMock/service/$httpBackend

ou source de: https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1830

Cependant, si les $http demandes dans la méthode à l'essai sont enchaînées (les requêtes suivantes ne sont faites après la demande précédente est résolu) alors vous aurez besoin de flush() pour chaque demande dans la chaîne. Sans voir le code testé c'est toute l'aide que je peux donner.

0

Vous devez simuler le seul appel http requis dans le bloc It et le vider après l'appel de la fonction. Sinon, il essaiera de vider les appels http inattendus, ce qui entraînera une erreur.