web-dev-qa-db-fra.com

Certains de vos tests ont effectué un rechargement de la page complète - erreur lors de l'exécution des tests Jasmine

Je rencontre un problème où lorsque j'exécute mes tests sur Jasmine, j'obtiens cette erreur ci-dessous. Le problème est qu'il semble se produire lorsque j'essaie d'exécuter un certain nombre de tests. Il ne semble pas être lié à un test particulier, comme si j'en commentais certains, les tests réussissent. Si je décommente certains tests, l'erreur apparaît. Si je commente ceux qui n'ont pas été commentés auparavant, ils passent tous à nouveau. (c.-à-d. si j'ai un test rouge, vert, bleu et orange et qu'il échoue, je commente orange et bleu, il passe, puis je décommente bleu et orange, il échoue à nouveau, mais si je commente rouge et vert, il passe à nouveau).

Chrome 41.0.2272 (Mac OS X 10.10.1) ERREUR Certains de vos tests ont fait un rechargement de page entière! Chrome 41.0.2272 (Mac OS X 10.10.1): Exécution de 16 des 29 (1 ÉCHEC) ERREUR (0,108 s/0,092 s)

Je suis perplexe quant à ce qui se passe. Plus j'ajoute de tests, plus cela devient un problème. Quelqu'un a-t-il déjà rencontré cela? Je n'ai aucune idée de ce qui pourrait en être la cause, car rien dans aucun de mes tests ne fait de redirection, et ils passent tous universellement sur une autre machine.

37
Siraris

Dans mon cas, le problème était que dans mon code source, j'avais un code définissant directement href sur l'objet location, comme window.location.href = 'quelque part ';

Dans mes spécifications, j'ai configuré un écouteur onbeforeunload qui renvoie simplement une chaîne au lieu de permettre à la redirection d'avoir lieu:

beforeAll(() => {
  window.onbeforeunload = () => 'Oh no!';
});
22
jpunk11

Assurez-vous que vos tests isolent correctement tous les modules testés avec des simulacres/espions. Le comportement que vous voyez me dit que vos tests ne s'exécutent pas vraiment de manière isolée - ils changent un état quelque part qui déclenchera un rechargement.

15
johnmcase

Je suppose que vous utilisez window.location quelque part dans votre code cible. Pour le passer, il suffit de créer un espion pour le window.onbeforeunload

Exemple:

window.onbeforeunload = jasmine.createSpy();

Ou encore mieux utiliser $window à la place, et cela ne se produira pas.

6
Adrian Diaconu

J'ai récemment rencontré cette erreur avec Karma 0.13.12. J'ai mis à niveau vers Karma 0.13.14 et mes tests fonctionnent à nouveau. Le problème pour moi (et probablement aussi pour @mqklin) était lié à https://github.com/karma-runner/karma/issues/1656 et https: // github. com/jasmine/jasmine/issues/945 .

2
mer10z_tech

Ce qui a fonctionné pour moi a été la mise à niveau de Karma de 1.4.0 vers 1.4.1 et la modification de la valeur maximumSpecCallbackDepth dans mon fichier jasmine.js de 20 à 100.

2
keimjohn

Essayez de réduire le nombre de sections describe ou de les supprimer complètement. Je ne sais pas pourquoi, mais ça marche pour moi.

2
mqklin

créer un espion sur la fonction qui a le window.location/reload a résolu le problème pour moi

1
Sebastian

Vous devez également vous assurer que les modules ne sont pas chargés deux fois. Dans mon cas, j'avais un fichier de module AngularJS -e.g., auth.controller.js dont le contenu était déjà regroupé dans un core.js fichier. Une fois que j'ai exclu les fichiers groupés sur le karma, l'erreur a disparu.

0
rebelliard

J'espère que vous avez utilisé window.location = "some url" dans votre code; Face à un problème similaire et résolu en utilisant les modifications ci-dessous.

Remplacé window.location dans le code par,

window.location.assign("some url");

Faites ce qui suit dans le test unitaire:

spyOn(window.location, "assign").and.callFake(() => {
    // Dummy assign call - so that your actual call will be faked and the reload will not happen. 
});
0
Easwaramoorthy K

Il résoudra cette erreur de redirection Karma!

var html = '<script type="text/javascript">';
html += 'window.location = "' + urlToRedirect +'"';
html += '</script>';
$( '.wrapper' ).append( html );
0
Debanik Saha

Dans le cas où il s'agissait du rappel ng-submit, qui n'appelle pas "event.preventDefault ()" et la page de rechargement du navigateur. Se moquer de $ location n'aide pas dans cette situation.

0
Daneel S. Yaitskov

J'utilisais setTimeout(() => window.location.replace('/'), 10); J'ai utilisé le code ci-dessous dans mon test unitaire et cela a fonctionné pour moi.

spyOn(global, 'setTimeout');
0
satkool007