Angular JS - Test d'une Fonction Avec une Page de Redirection à l'Aide de Karma / Jasmin
J'ai une fonction dans mon Angulaire contrôleur qui se présente comme suit:
$scope.myFunction = function(){
$scope.myVariable = "something";
$scope.myOtherVariable = "something else";
window.location.href = "/path/to/page";
}
Un simple Jasmin d'essai couvre la fonction ci-dessus et ressemble:
describe('my test', function(){
it('should pass', function(){
scope.myFunction();
expect(scope.myVariable).toBe('something');
expect(scope.myOtherVariable).toBe('something else');
});
});
Le test ci-dessus se passe, mais alors le Karma jette l'erreur suivante dans la console:
Certains de vos tests a fait un rechargement complet de la page!
La page de redirection est à l'origine de Karma pour élever cet avertissement. Quelle est la meilleure façon de contourner ce problème?
J'ai pensé à propos de donner à la fois des fonctions anonymes dans le Jasmin de test et Angulaire noms et ensuite à l'aide de arguments.le destinataire de l'appel.de l'appelant.nom à l'intérieur de la fonction d'origine pour déterminer si la fonction est appelée par lui-même ou de Jasmin. Malheureusement, arguments.le destinataire de l'appel.de l'appelant.nom renvoie toujours pas défini, ce qui je pense est causée par la façon Angulaire et le Jasmin sont liés les uns aux autres.
OriginalL'auteur Lloyd Banks | 2014-03-13
Vous devez vous connecter pour publier un commentaire.
Un long temps depuis que cette question a été posée, mais l'approche suivante devrait être plus propre:
Par la modification de la fonction d'origine pour utiliser Angulaire de dollars du service de fenêtre au lieu de la fenêtre du navigateur d'objet, il est possible d'écrire un test qui ne nécessite pas de modifier le code de production ou de prendre toute les paramètres d'exécution en compte. Bien sûr, cela nécessite que $fenêtre est une dépendance pour le contrôleur lorsque la fonction est trouvé.
À l'aide de angulaire se moque/ngMock, quelque chose comme:
devrait permettre le test à passer, en supposant que le contrôleur n'a pas besoin de fenêtre pour autre chose.
Dans la plupart des navigateurs le
window.location
est un non-écriture de la propriété, de sorte que la fourniture de votre propre faux objet est la meilleure façon de se moquer de ces non-inscriptible propriétés.Ce doit être la accepté de répondre. Vous ne devriez pas avoir à modifier le code cible pour obtenir les tests à exécuter dans la façon dont le actuellement accepté de répondre.
OriginalL'auteur orbitbot
Vous pouvez simplement créer une fonction qui fait la navigation tels que
ou même mieux dans certains services
Ensuite dans votre test, vous pouvez utiliser un espion sur Naviguer, pour être sûr que la navigation a été appelé, mais ne fait pas appel à la navigation.
OriginalL'auteur hassassin