Ich versuche, einen Status zu überprüfen, wenn der Container bereitgestellt wird, und einige Sekunden später, nachdem ich manuell Werte im Status festgelegt habe (mit setTimeout()).
Ich habe eine Funktion in mains „componentDidMount“ wie diese:
Aber ich habe keine Ahnung, wie ich den Status nach, sagen wir, 2000 ms noch einmal überprüfen soll?
Jede Hilfe ist willkommen 🙂
Lukas Liesis
Während Jest problemlos asynchronen Code ausführen kann, können Sie die Kombination von Promise und SetTimeout verwenden, um etwas zu warten. Dieser Code wartet beispielsweise 2 Sekunden:
await new Promise((r) => setTimeout(r, 2000));
Vollständiger Beispieltest. Vergessen Sie nicht hinzuzufügen async Flag vor der Callback-Funktion:
test('some test title', async () => {
const foo = true;
await new Promise((r) => setTimeout(r, 2000));
expect(foo).toBeDefined();
});
Beachten Sie außerdem, dass das standardmäßige „Timeout“ 5 Sekunden (5000 ms) beträgt. Wenn Ihr Test möglicherweise länger dauert, können Sie hinzufügen jest.setTimeout(30000); über test(). 30000 stellt sicher, dass es 30 Sekunden lang nicht zu einer Zeitüberschreitung kommt. Sie können eine beliebige Nummer hinzufügen, die Sie benötigen. Vollständiges Beispiel mit setTimeout:
jest.setTimeout(30000);
test('some test title', async () => {
const foo = true;
await new Promise((r) => setTimeout(r, 2000));
expect(foo).toBeDefined();
});
Sie können Timeout auch in der Jest-Konfiguration hinzufügen. Hier sind Konfigurationsdokumente
Was ist der Unterschied zu FakeTimers?
– aProgger
1. Dezember 2021 um 15:54 Uhr
FakeTimer sind, wie der Name schon sagt, Fake-Timer. setTimeout wartet auf echte Sekunden. Lesen Sie die Dokumente hier: jestjs.io/docs/timer-mocks
– Lukas Liesis
2. Dezember 2021 um 10:42 Uhr
Ich habe diesen Ansatz mit der React-Komponente verfolgt useState. Die Testbibliothek hat mich vor der Verwendung gewarnt act(...) und ich tat let timeout = null; await act(async () => { await new Promise((r) => { timeout = setTimeout(r, 2000) }) });. Dann muss ich es verwenden useEffect(()=> { return () => { cleanTimeout(timeout) } }, [timeout]) um alle Warnungen zu lösen.
– Enrique René
7. April 2022 um 19:33 Uhr
Ich habe diesen Code nicht wirklich getestet. Aber etwas Ähnliches sollte meiner Meinung nach funktionieren.
Sie können auch anrufen useFakeTimers() in einem beforeEach wenn Sie mehrmals testen möchten und auch runAllTimers() könnte in einem anderen sein beforeEach damit du dich nicht wiederholst.
Ich weiß, dass dies eine Frage ist, wie man etwas nach 20 Sekunden überprüft. Dies könnte aber auch ein Indikator dafür sein, dass Sie nicht 20 Sekunden lang testen möchten, da es manchmal darauf ankommt, ob eine bestimmte Aktion mit den richtigen Eingaben ausgeführt wurde. In diesem Fall könnten Sie Ihren Code etwas umstrukturieren, sodass Sie eine Dispatch-Funktion übergeben können. Zum Beispiel
function abc() {
return dispatch => {
return Promise.then(res => {}) // this would take 20 seconds
}
}
Weil dispatch übergeben wird, daher können Sie Folgendes problemlos im Testcode verwenden.