2015-03-30 14 views
32

Ich stoße auf ein Problem, bei dem ich, wenn ich meine Tests auf Jasmine ausführe, diesen Fehler unten bekomme. Das Problem ist, es scheint zu passieren, wenn ich versuche, eine bestimmte Anzahl von Tests auszuführen. Es scheint nicht an einen bestimmten Test gebunden zu sein, so als würde ich einige auskommentieren, die Tests vergehen. Wenn ich einige Tests auskommentiere, wird der Fehler angezeigt. Wenn ich Kommentare auskommentiere, die vorher unkommentiert waren, werden sie alle erneut übergeben. (Dh wenn ich rot, grün, blau und orange testen muss und es fehlschlägt, komm ich orange und blau hervor, dann blau und orange komment er nicht mehr, aber wenn ich rot und grün auszeichne, passiert es wieder).Einige Ihrer Tests haben einen vollständigen Seiten-Reload durchgeführt - Fehler beim Ausführen von Jasmine-Tests

Chrome 41.0.2272 (Mac OS X 10.10.1) ERROR Einige Ihrer Tests haben eine ganze Seite neu laden! Chrome 41.0.2272 (Mac OS X 10.10.1): Ausgeführt 16 von 29 (1 FAILED) ERROR (0,108 sec/0.092 Sekunden)

Ich bin ratlos, was los ist. Je mehr Tests ich hinzufüge, dann wird das ein Problem. Ist das schon mal jemand begegnet? Ich habe keine Ahnung, was es verursachen könnte, da nichts in irgendeinem meiner Tests irgendeine Art von Umleitung macht und sie alle universell auf einer anderen Personenmaschine durchgehen.

+0

Können Sie einige der Tests zu der Frage hinzufügen, um ein Gefühl für das Problem zu bekommen. –

+0

Wie die Fehlermeldung besagt, verursachen Ihre Tests eine vollständige Seitenauslastung. Sie sollten versuchen herauszufinden, warum die Seite geladen wird. Die Tests müssen zu einem neuen Speicherort navigieren. –

+0

Verwendet Ihre App zufällig einen UI-Router? – Manube

Antwort

14

Vergewissern Sie sich, dass Ihre Tests alle getesteten Module mit Mocks/Spies ordnungsgemäß isolieren. Das Verhalten, das Sie sehen, sagt mir, dass Ihre Tests nicht wirklich isoliert laufen - sie ändern irgendwo einen Zustand, der ein Nachladen auslöst.

+0

Ich fand den Ort tatsächlich nach dem Angebot der Prämie. Und ja, Sie haben Recht mit dem Geld. In meinem Fall wurde der Reload nach einer bestimmten Anzahl von Tests aus irgendeinem Grund ausgelöst - wegen eines ausstehenden http-httprequest an ein externes System, das genau zwischen Test 13 und 14 abgelaufen ist ...;) –

2

Versuchen Sie, die Anzahl der describe Abschnitte zu reduzieren oder entfernen Sie sie vollständig. Ich weiß nicht warum, aber es funktioniert für mich.

+0

Funktioniert auch für mich. Ich würde gerne verstehen, warum ... –

0

Sie müssen auch sicherstellen, dass die Module nicht zweimal geladen werden. In meinem Fall hatte ich eine AngularJS-Moduldatei, z. B. auth.controller.js, deren Inhalt bereits in einer core.js Datei gebündelt war. Sobald ich die gebündelten Dateien auf Karma ausgeschlossen habe, ist der Fehler verschwunden.

15

In meinem Fall war das Problem, dass in meinem Quellcode hatte ich Code die href auf dem Standort Objekt direkt einstellen, wie window.location.href = 'irgendwo';

In meiner Spezifikationen richte ich einen onbeforeunload Zuhörer, die nur einen String zurückgibt, anstatt die Umleitung zu erlauben stattzufinden:

beforeAll(() => { 
    window.onbeforeunload =() => 'Oh no!'; 
}); 
+0

Dies ist die Lösung – Emidomh

2

Was für mich gearbeitet wurde Karma von 1.4.0 auf 1.4 Upgrade .1 und Ändern der MaximumSpecCallbackDepth in meiner Datei jasmine.js von 20 bis 100.

+0

Bitte formatieren Sie diese Antwort und erweitern Sie sie ein wenig. –

4

Ich nehme an, Sie verwenden window.location irgendwo in Ihrem Zielcode. Um nur passieren sie einen Spion für das Beispiel window.onbeforeunload

erstellen:

window.onbeforeunload = jasmine.createSpy(); 

Oder noch besser $window stattdessen verwenden, und dies wird nicht passieren.

+0

Es hat funktioniert, aber mit einem Argument innerhalb createSpy - nur eine Zeichenfolge. –

0

Ich benutzte setTimeout(() => window.location.replace('/'), 10); Ich verwendete unten Code in meinem Komponententest und es arbeitete für mich.

spyOn(global, 'setTimeout'); 
0

einen Spion auf der Funktion zu schaffen, die die window.location hat/für das Problem behebt reload ich

+0

Können Sie genauer sein? –

0

Hoffnung, die Sie window.location = "some url" in Ihrem Code verwendet haben; Konfrontiert ähnliches Problem, und gelöst durch die Verwendung der folgenden Änderungen.

ersetzt window.location im Code mit,

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

die unten in Unit-Test durchführen:

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

Falls es wurde ng einreichen Rückruf, die nicht Ereignis nicht nennen“ .preventDefault() "und der Browser lädt die Seite neu. Das Verspotten von $ Standort hilft in dieser Situation nicht.

Verwandte Themen