Open1

【Jest】Jest did not exit one second after the test run has completed.エラーの解決方法📝

まさぴょん🐱まさぴょん🐱

Jest did not exit one second after the test run has completed.エラーの解決方法📝

エラー内容📝

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with --detectOpenHandles to troubleshoot this issue.

原因

Jestがテスト実行完了後すぐにプロセスを終了せず、「1秒経ってもJestが終了しない」というメッセージが表示される場合は、テスト内で使われた非同期処理などが完全にクリーンアップされていない可能性が高いです。
たとえば、以下のようなケースが考えられます。

  1. テスト中に開いたソケットやDB接続を閉じていない
  2. setTimeout, setInterval などのタイマーをクリアしていない
  3. ストリームやサブスクリプションなどを購読したままにしている
  4. 非同期のコールバックが完了していない (Promiseやコールバックがresolve/rejectされていない など)

原因箇所の特定方法📝

エラーメッセージにもあるように、--detectOpenHandles オプションを使うと、テスト実行後にどのような“開いたハンドル”(非同期処理)が残っているかをJestが検知してレポートしてくれます。

[Jest実行コマンド] --detectOpenHandles

解決方法

原因箇所の特定したら、それに応じた対応をします📝

1. クリーンアップ処理がないことが原因の場合

テストで使われている非同期処理・接続などは、すべて終了させる必要があります。
例えば、

  • DBや外部APIとの接続を afterAll() などで切断する。
  • setTimeout, setInterval を使った場合は clearTimeout, clearInterval で必ずクリーンアップする。
  • イベントリスナーやストリーム、WebSocketなどを使用したら、テスト終了時に閉じる。

2. Promiseの取り扱いが原因の場合
非同期コードでPromiseを返している場合、必ずawaitして完了を待つか、テストの最後までにresolve/rejectされるようにします。

Jestで非同期テストを書く場合は async/await か、あるいはテストの最後に.then / .catch をつけるなどして、テストがきちんと終了するようにしてください。