ReferenceError: Sie versuchen, eine Datei zu „importieren“, nachdem die Jest-Umgebung heruntergefahren wurde

Lesezeit: 6 Minuten

Benutzer-Avatar
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)

Link zum Ersatz

https://repl.it/repls/PartialGrimyMetadata

Umfeld:

  • Betriebssystem: Linux 4.14
  • Knoten: 6.14.2
  • Garn: 1.7.0
  • npm: 3.10.10
  • Wächter: Nicht gefunden
  • Xcode: Nicht zutreffend
  • Android Studio: Nicht gefunden

Benutzer-Avatar
Nrion

Okay, Lösung gefunden.

Sollte nutzen jest.useFakeTimers()

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

    – iLyas

    17. Juni 2021 um 4:48 Uhr

  • Siehe die Dokumentation hier: jestjs.io/docs/timer-mocks

    – Traumbombe

    2. Juli 2021 um 14:28 Uhr

jest.useFakeTimers()

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

"jest": {
  "testEnvironment": "jsdom",
  "preset": "react-native",
   ...

entnommen aus: https://stackoverflow.com/a/64567257/728287

  • zusätzlich habe ich hinzugefügt afterEach(cleanup); und die Warnung verschwand. 😀

    – Ponja

    27. Juli 2021 um 14:14 Uhr

  • @Ponja afterEach ist in meinem Fall undefiniert, hast du eine Idee, woher du es importieren kannst?

    – DHRUV GAJWA

    11. Februar um 5:01 Uhr

  • es ist Teil des Scherzes jestjs.io/docs/setup-teardown

    – Ponja

    12. Februar um 20:11 Uhr

  • Warum funktioniert das? In der reagierenden nativen Umgebung gibt es kein DOM, daher sollte dies nicht erforderlich sein.

    – Petr Hurtak

    30. April um 10:56 Uhr

  • @PetrHurtak vielleicht hast du recht. das Wichtigste sieht so aus, als wäre es das preset jest-bot.github.io/jest/docs/tutorial-react-native.html

    – Gianfranco P.

    11. Mai um 13:41 Uhr

Zur Beantwortung möchte ich gerne beitragen.

Sehen wir uns die Fehlermeldung an

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!

Benutzer-Avatar
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

Benutzer-Avatar
Ruslan Walejew

Keines der oben genannten funktioniert für mich. Meine Lösung ist zu ergänzen jest-setup.js Datei diesen Code:

import { Animated } from 'react-native';

Animated.timing = () => ({
    start: () => jest.fn(),
});

Vergessen Sie nicht, diese Datei zu Ihrer hinzuzufügen Paket.json Scherzkonfiguration:

...
  "jest": {
    ...,
    "setupFiles": [
      "<rootDir>/src/tests/jest-setup.js"
    ]
  },
...

Ich hoffe, es wird jemandem helfen

  • Cannot assign to 'timing' because it is a read-only property.

    – Chance Smith

    22. März um 19:39 Uhr

1120620cookie-checkReferenceError: Sie versuchen, eine Datei zu „importieren“, nachdem die Jest-Umgebung heruntergefahren wurde

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy