ReferenceError: Sie versuchen, eine Datei zu „importieren“, nachdem die Jest-Umgebung heruntergefahren wurde
Lesezeit: 6 Minuten
Nrion
Ich habe eine Komponente, die Gebrauch macht Animated Komponente von React Native. Ich fing an, einen Testfall zu schreiben, um ihn zu simulieren onPress einer Komponente, die eine Funktion aufruft, die hat Animated.timing darin und setState.
laufend jest funktioniert gut, aber die Tests hören nie auf zu laufen, und ein unabhängiger Testfall, den ich zuvor geschrieben habe, scheint jetzt nie bestanden zu werden (der zuvor bestanden wurde).
laufend jest --watchbekomme ich diesen Fehler:
ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.
at Function.bezier (node_modules/react-native/Libraries/Animated/src/Easing.js:113:21)
at ease (node_modules/react-native/Libraries/Animated/src/Easing.js:34:24)
at TimingAnimation._easing (node_modules/react-native/Libraries/Animated/src/Easing.js:133:18)
at TimingAnimation.onUpdate (node_modules/react-native/Libraries/Animated/src/animations/TimingAnimation.js:107:45)
RUNS src/__tests__/SlideDownMenu.test.js
/home/nrion/Desktop/mobile-ui/PriceInsight_app/node_modules/react-native/Libraries/Animated/src/Easing.js:114
return _bezier(x1, y1, x2, y2);
^
TypeError: _bezier is not a function
at Function.bezier (/home/nrion/Desktop/mobile-ui/PriceInsight_app/node_modules/react-native/Libraries/Animated/src/Easing.js:224:12)
at ease (/home/nrion/Desktop/mobile-ui/PriceInsight_app/node_modules/react-native/Libraries/Animated/src/Easing.js:94:21)
at TimingAnimation._easing (/home/nrion/Desktop/mobile-ui/PriceInsight_app/node_modules/react-native/Libraries/Animated/src/Easing.js:255:16)
at TimingAnimation.onUpdate (/home/nrion/Desktop/mobile-ui/PriceInsight_app/node_modules/react-native/Libraries/Animated/src/animations/TimingAnimation.js:138:14)
at ontimeout (timers.js:386:11)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)
Hinweis: Fügen Sie den obigen Code gleich danach ein import Abschnitt in Ihrer Testdatei.
wo verwenden wir das?
– Dopatraman
14. Juni 2019 um 23:51 Uhr
@dopatraman Ich habe es nach den Importen in meiner Testdatei verwendet. (Ist das richtig? Es hat funktioniert.) Aber siehe unten von TARJU auch über seine Verwendung.
– Nabha
4. September 2019 um 23:20 Uhr
Wenn Sie eine src__tests__\jestSetup.ts haben, können Sie sie dort besser einstellen, sie funktioniert für jeden Test.
– netalex
26. November 2020 um 9:12 Uhr
Leider hat es bei mir nicht funktioniert, ich habe die Websocket-Verbindung in einer getesteten Datei verwendet, die immer wieder fehlschlägt
Mit oben ist es äußerst wichtig, dies zu verstehen
jest.useFakeTimers() verspottet setTimeout und andere Timer-Funktionen mit Scheinfunktionen.
Wenn mehrere Tests innerhalb einer Datei oder eines Beschreibungsblocks ausgeführt werden, jest.useFakeTimers(); kann vor jedem Test manuell oder mit einer Setup-Funktion wie beforeEach aufgerufen werden.
Andernfalls wird der interne Nutzungszähler nicht zurückgesetzt.
Hinzufügen "testEnvironment": "jsdom" hinein jest geben Sie package.json oder jest.config.js ein
ReferenceError: You are trying to 'import' a file after the Jest environment has been torn down.
Abgerissen bedeutet: Jest ist bereits fertig mit der Ausführung und ein Teil Ihres Codes versucht auszuführen, nachdem Jest abgerissen oder Ihren Test beendet hat. Dies ist bei Javascript aufgrund seiner asynchronen Natur ziemlich üblich.
Manchmal passiert es, nachdem ein Promise-Callback ausgeführt wird, zum Beispiel:
import { someProcess} from 'a-library'
task.job().then(result => {
someProcess(result)
})
Im obigen Beispiel importiert der Code someProcess aus a-library
Wenn die Methode job von dem task Objekt dauert länger als die Scherzausführung, sein Callback (then()-Aufruf) wird außerhalb von Scherz ausgeführt, da Scherz fortgesetzt wurde. Also wann someProcess ausgeführt wird, wird es geladen a-library Jest wird sich also darüber beschweren, dass Sie versuchen, eine Bibliothek zu laden, nachdem Jest zerrissen wurde.
Die als Lösung markierte Antwort ist teilweise richtig, weil angerufen wird jest.useFakeTimers() verhindert, dass Ihr Code die n Sekunden wartet, die Sie warten sollten, indem Sie setTime oder ähnliches aufrufen, wodurch Ihr Code künstlich sincrhonoyus wird
Machen Sie Ihren Test await Diese Methodenaufrufe würden Ihnen helfen, Ihren Code besser zu verstehen.
Der Code, der für mich funktionierte, war
describe("Some test set " , ()=>{
let heavyWorkinService = library.workingService();
// We are marking the test function call as async
test(("Name of the test"), async ()=>{
// we are awaiting heavyWorkingService to done its job
await hevyWorkingService("some data")
})
})
In meinem realen Szenario hat mein Code Daten von Firebase abgerufen, da ich für diesen Test keine Mocks verwende, sondern versucht habe, Firebase zu importieren, nachdem die gelesenen .get()-Daten zurückgegeben wurden, um den Test als zu markieren async und Aufruf der Methode mit await Schlüsselwort hat mein Problem gelöst
Natürlich gibt es viele Möglichkeiten, mit diesem Fehler umzugehen, ich wollte nur, dass Sie den wahren Grund für diesen Fehler kennen, damit Sie an der richtigen Lösung für Ihre Tests arbeiten können!
Zweiter Sohn
ich benutze @testing-library/react-nativealso was ich getan habe, ist zu cleanup in der Setup-Datei.
// jest.setup.js
import { cleanup } from '@testing-library/react-native';
afterEach(cleanup);
ReferenceError: afterEach ist nicht definiert
– Henrique Bruno
9. Februar um 1:25
Sie müssen setupFilesAfterEnv für beforeAll, afterAll, afterEach usw. verwenden
– Ryan Pfister
9. Februar um 21:56 Uhr
fügen Sie die folgenden Zeilen hinzu ganz am Ende der Jest-Test-Datei, schließlich werden Tests geschrieben.
afterAll(() => {
mongoose.connection.close()
})
und auch nur Führen Sie einen Einzeltest durch Datei auf einmalzum Beispiel,
> jest --verbose --runInBand -- filename.test.js
ReferenceError: afterEach ist nicht definiert
– Henrique Bruno
9. Februar um 1:25
Sie müssen setupFilesAfterEnv für beforeAll, afterAll, afterEach usw. verwenden
– Ryan Pfister
9. Februar um 21:56 Uhr
Ruslan Walejew
Keines der oben genannten funktioniert für mich. Meine Lösung ist zu ergänzen jest-setup.js Datei diesen Code: