Ich benutze Puppenspieler und Scherz, um einige Front-End-Tests durchzuführen.
Meine Tests sehen wie folgt aus:
describe("Profile Tab Exists and Clickable: /settings/user", () => {
test(`Assert that you can click the profile tab`, async () => {
await page.waitForSelector(PROFILE.TAB);
await page.click(PROFILE.TAB);
}, 30000);
});
Wenn ich die Tests durchführe, funktioniert manchmal alles wie erwartet. In anderen Fällen wird eine Fehlermeldung angezeigt:
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
at node_modules/jest-jasmine2/build/queue_runner.js:68:21
at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
Das ist seltsam, weil:
Ich habe das Timeout auf 30000 festgelegt
Ob ich diesen Fehler bekomme oder nicht, scheint sehr zufällig zu sein
Kann jemand erraten, warum dies geschieht?
Antworten:
Das hier angegebene Zeitlimit muss daher kürzer sein als das Standardzeitlimit.
Das Standardzeitlimit ist
5000
und das Framework ist standardmäßigjasmine
im Fall vonjest
. Sie können das Zeitlimit innerhalb des Tests durch Hinzufügen angebenDies wäre jedoch spezifisch für den Test. Oder Sie können die Konfigurationsdatei für das Framework einrichten.
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
Siehe auch diesen Thread
https://github.com/facebook/jest/issues/5055
https://github.com/facebook/jest/issues/652
PS-Rechtschreibfehler
setupFilesAfterEnv
(dhsetupFileAfterEnv
) führen ebenfalls zu demselben Fehler.quelle
setupTestFrameworkScriptFile
durch ersetzt wurdesetupFilesAfterEnv
, so wird essetupFilesAfterEnv: ["./jest.setup.js"]
jest.setTimeout(10000)
dies zu einem einzelnen Test für einen Edge-Fall hinzugefügt werden konnte, sodass die gesamte Konfiguration nicht geändert werden musste :)jest.setTimeout(30000);
injest.config.js
erhalte ich „Reference: Scherz ist nicht definiert“. Ich habe versucht hinzuzufügen,const jest = require("jest");
aber dann erhalte ich "TypeError: jest.setTimeout ist keine Funktion".setupFilesAfterEnv
Argument injest.config.js
soll auf eine andere Datei verweisen, in die wir diejest.setTimeout(30000)
Option einfügen. Es ist schön, dass wir dies konfigurieren können, aber es scheint mir ein bisschen kompliziert zu sein.Es sollte das aufrufen,
async/await
wenn es vom Test asynchron ist.quelle
done
eine asynchrone Funktion haben? Geben wir nicht einfach Versprechen oder undefiniert zurück?page.click
. done () wird zumindest in meinem Fall hauptsächlich zum Testen mit Rückrufen verwendet.done
Rückruf entfernt, der nicht benötigt wird.done
in diesem Fall benannt) im Rückruf führt dazu, dass Jest wartet, bis dieser Parameter aufgerufen wird. Seine Anwesenheit ist signifikant, auch wenn es nicht verwendet wird.Die Antwort auf diese Frage hat sich geändert, als sich Jest weiterentwickelt hat. Aktuelle Antwort (März 2019):
Sie können das Timeout jedes einzelnen Tests überschreiben, indem Sie dem einen dritten Parameter hinzufügen
it
. dh.it('runs slow', () => {...}, 9999)
Sie können die Standardeinstellung mit ändern
jest.setTimeout
. Um dies zu tun:und
done
ist dies beim asynchronen / abwartenden Ansatz nicht erforderlich.quelle
Ich möchte hinzufügen (dies ist ein bisschen lang für einen Kommentar), dass selbst mit einer Zeitüberschreitung
3000
meiner Tests manchmal (zufällig) immer noch mit scheitern würdeDank der großartigen Antwort von @ Tarun denke ich, dass der kürzeste Weg, um viele Tests zu reparieren, ist:
quelle
jest.setTimeout()
innenbeforeEach
, es einmal Aufruf für alle Tests genug ist.Dies ist ein relativ neues Update, aber es ist viel einfacher. Wenn Sie jest 24.9.0 oder höher verwenden, können Sie einfach
testTimeout
zu Ihrer Konfiguration hinzufügen :quelle
Stellen Sie sicher, dass Sie
done();
bei Rückrufen aufrufen, da sonst der Test nicht einfach bestanden wird.Gilt für alle anderen Funktionen, die einen Rückruf von done () haben.
quelle
Für Scherz 24.9+ können Sie das Zeitlimit auch über die Befehlszeile festlegen, indem Sie hinzufügen
--testTimeout
Hier ist ein Auszug aus den Dokumenten
quelle
Ich bin kürzlich aus einem anderen Grund auf dieses Problem gestoßen: Ich habe einige Tests synchron mit ausgeführt
jest -i
, und es würde nur eine Zeitüberschreitung auftreten. Aus welchen Gründen auch immer, das Ausführen derselben Tests mitjest --runInBand
(obwohl-i
dies als Alias gedacht ist) ist keine Zeitüberschreitung.Vielleicht hilft das jemandem
¯\_(:/)_/¯
quelle
Das Timeout-Problem tritt auf, wenn entweder das Netzwerk langsam ist oder viele Netzwerkanrufe verwendet werden
await
. Diese Szenarien überschreiten das Standard-Timeout, dh 5000 ms. Um den Timeout-Fehler zu vermeiden, erhöhen Sie einfach das Timeout von Globals, die ein Timeout unterstützen. Eine Liste der Globals und ihrer Unterschrift finden Sie hier .Für Scherz 24.9
quelle
Wenn auf Scherz <= 23:
Wenn auf Scherz> 23:
quelle
Für diejenigen, die eine Erklärung dazu suchen, lesen
jest --runInBand
Sie die Dokumentation Ausführen von Puppenspieler in CI-Umgebungen https://github.com/smooth-code/jest-puppeteerquelle
Falls jemand das Problem mit den oben genannten Methoden nicht behebt, habe ich meine behoben, indem ich die asynchrone Funktion mit einer Pfeilfunktion umgeben habe. Wie in:
quelle
In meinem Fall trat dieser Fehler zufällig auf und verschwand auch nach dem Festlegen eines Zeitlimits von 30000 nicht. Durch einfaches Beenden des Vorgangs im Terminal und erneutes Ausführen der Tests wurde das Problem für mich behoben. Ich habe auch das Timeout entfernt und die Tests werden immer noch bestanden.
quelle
In Node ... was ich als Beispiel sehe, ist unten mit
fakeEventEmitter
quelle