web-dev-qa-db-ja.com

ReferenceError:Jest環境が破棄された後、ファイルを「インポート」しようとしています

React NativeのAnimatedコンポーネントを利用するコンポーネントがあります。コンポーネントのonPressをシミュレートするテストケースの作成を開始しました。これは、Animated.timing、およびsetState

jestの実行は正常に動作しますが、テストの実行が停止することはなく、以前に記述した無関係なテストケースの1つが(以前に合格した)合格することはありません。

ランニング jest --watch、このエラーが表示されます。

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)

Replへのリンク

https://repl.it/repls/PartialGrimyMetadata

環境:

  • OS:Linux 4.14
  • ノード:6.14.2
  • 糸:1.7.0
  • npm:3.10.10
  • ウォッチマン:見つかりません
  • Xcode:なし
  • Android Studio:見つかりません
12
nrion

OK、解決策を見つけました。

jest.useFakeTimers()を使用する必要があります

15
nrion

jest.useFakeTimers()

上記のことを理解することは非常に重要です

jest.useFakeTimers()は、setTimeoutおよびその他のタイマー関数をモック関数でモックアウトします。

1つのファイルまたは記述ブロック内で複数のテストを実行する場合、jest.useFakeTimers();各テストの前に手動で呼び出すか、beforeEachなどのセットアップ関数を使用して呼び出すことができます。

そうしないと、内部使用カウンタがリセットされません。

0
TARJU