Comment se moquer de $de la fenêtre.emplacement.remplacer dans AngularJS test unitaire?
J'ai eu le service suivant:
angular.module("services")
.factory("whatever", function($window) {
return {
redirect: function() {
$window.location.replace("http://www.whatever.com");
}
};
});
La façon de se moquer de $window
objet de test de l'unité pour éviter le rechargement de la page lors de l'exécution de tests?
J'ai essayé d'utiliser
spyOn($window.location, 'replace').andReturn(true);
mais il n'a pas (encore "Some of your tests did a full page reload!"
erreur) et
$provide.value('$window', {location: {replace: jasmine.createSpy()}})
mais j'obtenais un message d'erreur (Error: [ng:areq] Argument 'fn' is not a function, got Object
) avec la trace de la pile de pointer seulement angulaire propre source, il n'est donc pas très utile...
- J'ai été confronté au même problème. Avez-vous trouver une solution?
- La solution fournie par PaulL pour envelopper
$window.location
dans un service séparé, en fait, il fonctionne très bien. N'avez pas essayé LostInComputer de solution pour le moment.
Vous devez vous connecter pour publier un commentaire.
En Chrome (n'a pas de test inother navigateurs), de l'emplacement.remplacer la est en lecture seule, donc spyOn n'était pas capable de le remplacer.
$provide.value
devrait fonctionner. Quelque chose doit être mal quelque part dans votre code.Ici est un travail de l'unité de test
scrollTo
espion, sinon angularjs se plaignait:$window = { location: { replace: jasmine.createSpy() }, scrollTo: jasmine.createSpy() }
module
que vous utilisez? Est-ilangular.module
?angular.mock.module
?Je vais avec un plus facile, mais peut-être moins élégant. Je suis en train d'écrire un wrapper pour la somme de fenêtre.l'emplacement, à laquelle je peux ensuite se moquer. Relatives à votre code, je serais en se moquant de l'autre.rediriger la fonction, plutôt que de se moquant de $de la fenêtre (je suppose ici que votre fonction réelle est plus complexe).
Donc je finirais avec:
Je peux alors directement se moquer de la méthode de redirection, et seulement de la confiance, puisque c'est une seule ligne de code, il ne peut pas vraiment se tromper.
C'est suffisant pour mes besoins, et me permet de valider l'url appelée.
Je vais vous proposer une autre approche qui pourrait fonctionner pour vous. J'ai connu le même problème alors que les tests unitaires d'un contrôleur à "l'action" qui, en définitive, redirige l'utilisateur (à plein chargement de la page, mais à une autre page dans le plus grand site web/application). Pour donner le contexte, le contrôleur envoie une requête AJAX, et si la réponse est OK, il va rediriger l'utilisateur vers une autre page via $de la fenêtre.emplacement.replace():
Le test pour le contrôleur en fonction de la cause, "Certains de vos tests a fait un rechargement complet de la page!" erreur. J'ai donc ajouté ce qui suit à la beforeEach() la fonction du contrôleur de spec, pour se moquer de l ' $service de fenêtre:
Bien sûr, cette solution m'empêche de (proprement) vérifier que la fonction de remplacement a été appelé avec un argument, mais je ne m'en soucie pas vraiment de ce droit maintenant.... Espérons que cela aide.
Je pense que ce que vous voulez est d'utiliser le $lieu service, plutôt que d'appeler
$window.location
. Il y a aussi toute une page expliquant cette fonctionnalité ici: http://docs.angularjs.org/guide/dev_guide.services.$emplacement.À l'aide de cela, il devrait être assez simple à utiliser un écrasé version du $service de localisation dans des tests.
$lieu.replace();
//ou vous pouvez la chaîne ainsi: $lieu.path('/someNewPath').replace();