Troubleshooting
おやおや、うまくいきませんか?Jestについての問題を解決するのにこのガイドをご利用下さい。
理由は分からないがテストが失敗する #
Nodeに組み込まれているデバッグサポート機能を試してみて下さい。
注意: Jestのデバッグサポート機能は
node debug
のみサポートしています。node inspect
は現在挙がっているnodejs/node#7583のためにサポートしていません。 当該の問題が解決されるまで、 Node バージョン8.x系ではNodeを使ったデバッグは利用できません。詳細については facebook/jest#1652を参照して下さい。
debugger;
宣言をテストの任意の箇所に記述し、プロジェクトのディレクトリで以下のコマンドを実行して下さい。
node --debug-brk ./node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --debug-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
このコマンドでJestは外部からのデバッガと接続できる状態のNodeプロセス上で実行されます。プロセスはデバッガが接続されるまでポーズすることに注意して下さい。
例えば、ポーズされたプロセスにNode Inspectorデバッガを接続するには、まず(まだインストールしていない場合は)デバッガをインストールします:
npm install --global node-inspector
それから単にデバッガを実行します:
node-inspector
デバッガはChromeで開けるリンクを出力します。 リンクを開くとChromeDeveloperToolsが表示されJestのCLIスクリプトの1行目にブレークポイントが設定されます(これは単に開発者ツールを開くための時間を設けて、その前にJestが実行されてしまうのを防ぐためのものです)。 次の実行に進むには画面の上部右側にある再生ボタンのようなボタンをクリックします。 debugger
宣言を含むテストをJestが実行した場合、実行はポーズされ現在いのスコープとコールスタックを調べることができます。
注意: コマンドラインの
--runInBand
オプションは個々のテストに対してプロセスを生成するのではなく必ず同じプロセスでJestを実行します。 通常Jestはプロセスをまたいで並列にテストを実行しますが、同時に複数のプロセスをデバッグするのは困難だからです。
Nodeによるデバッグについての詳細はここで確認できます。
キャッシュ関連の問題 #
Jestがコードを変換するスクリプトの変更や、babelのアップデートを認識できていませんか?
--no-cache
オプションを付けて再実行してみて下さい。 Jestはテスト実行の高速化のために変換されたモジュールファイルをキャッシュします。 独自のトランスパイラを使用している場合は、getCacheKey
関数を追加することを検討して下さい:getCacheKey in Relay。
Promiseが解決されない #
promiseが全く解決されない場合、このエラーが投げられるでしょう:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`
最も多い原因はPromiseの実装が競合していることです。 グローバルなPromiseの実装を独自のものに置き換えます、例えばglobal.Promise = require.requireActual('promise');
とします。そして(もしくは)使用しているPromiseのライブラリを1つだけに統合してみることを検討して下さい。
テストの実行が長時間かかる場合は、jest.setTimeout
を呼び出してタイムアウト時間を伸ばすことも検討したくなるでしょう。
jest.setTimeout(10000); // 10 second timeout
Watchman関連の問題 #
Jestを--no-watchman
オプション付きで実行するか 構成オプションでwatchman
をfalse
に設定してみてください。
watchman troubleshootingも参照して下さい。
Dockerおよび/またはCIサーバ上でテストが極端に遅くなる #
大抵の場合、モダンな高速なSSDとマルチコアのコンピュータではJestはとても早く動作しますが、特定のセットアップ環境では遅いことがユーザにより 発見 されています。
調べた結果に基づいて、この問題を軽減してして最大50%高速化する1つの方法は、テストを順番に実行することです。
これを実施するには--runInBand
オプションを指定してテストを同じスレッドで実行して下さい。
# Using Jest CLI jest --runInBand # Using npm test (e.g. with create-react-app) npm test -- --runInBand
テスト実行時間を高速化するもう1つの案としてはTravis-CIのようなCIサーバでワーカーのプール数を最大4までに設定することです。 Travis-CIに特定すると、テストの実行時間を半分にできます。 注意: オープンソースプロジェクトで利用できるTravis-CIの フリープランは2CPUコアまでしか割り当てられません。
# Using Jest CLI jest --maxWorkers=4 # Using npm test (e.g. with create-react-app) npm test -- --maxWorkers=4
自動モック機能を利用するとテストが遅くなる #
設定オプションで automock: true
とするかテストで大量のjest.mock('my-module')
を呼び出すかした場合、自動モック機能は大規模なプロジェクトでパフォーマンスの低下を引き起こすことがあります。 モジュールのより多くの依存関係を持つほど、Jestはよりモック化により多くの労力を必要とします。 このパフォーマンスの低下を大幅に抑えるものとしてはimport
または require
コールを常に実行されるモジュールの先頭から、下方の通常は実行されないモジュールの中へ移動させるようにコードを変換する処理を追加することです。 これによりテスト実行時にJestがロードしなければならないモジュールの数を大幅に減らすことができます。
import
宣言の変換にはbabel-plugin-transform-inline-imports-commonjsが、 require
宣言の変換にはbabel-preset-fbjs
パッケージの一部であるFacebook製のinline-requires
babel プラグインを使用してください。
npm3使用時に node_modulesが正しくロードされない #
jest-cli
をバージョン 0.9.0
以上にアップグレードして下さい。
非モック化したimportしたモジュールはbabel使用時に動作しないのですか? #
jest-cli
をバージョン 0.9.0
以上にアップグレードして下さい。
説明:
jest.dontMock('foo'); import foo from './foo';
ES6では、import宣言は他の全ての記述の前に移動されます。
const foo = require('foo'); jest.dontMock('foo'); // Oops!
Jestバージョン0.9.0では、新たに jest.unmock
APIが追加されました。babelプラグインとともに、現在は babel-jest
を使用した場合は正しく動作します。
jest.unmock('./foo'); // Use unmock! import foo from './foo'; // foo is not mocked!
バベルのサポートを有効にする手順は Getting Startedガイドを参照して下さい。
Jestをバージョン0.9.0にアップグレードするとテストが失敗するようになったのですが? #
Jestは現在デフォルトでJasmine2を使用しています。Jasmineの upgrade guideを利用して簡単にJasmine1からJasmine2にアップグレードできます。
もしJasmine1を使い続けたいのなら、 testRunner
構成オプションを jasmine1
に設定するかコマンドラインオプションで --testRunner=jasmine1
を指定して下さい。
互換性の問題 #
JestはNodeバージョン4で追加された機能を利用します。 Nodeの最新の安定版リリースにアップグレードすることをお勧めします。 最低限サポートされているバージョンは、v4.0.0
です。 バージョン0.x.x
系はサポートされていません。
まだ解決しませんか? #
Help を参照してください。