Troubleshooting
Uh oh, something went wrong? Use this guide to resolve issues with Jest.
理由は分からないがテストが失敗する
Node に組み込まれているデバッグサポート機能を試してみて下さい。 Note: This will only work in Node.js 8+.
debugger;
宣言をテストの任意の箇所に記述し、プロジェクトのディレクトリで以下のコマンドを実行して下さい。
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
This will run Jest in a Node process that an external debugger can connect to. Note that the process will pause until the debugger has connected to it.
Google Chrome (もしくは Chromium ベースのブラウザ)でデバッグするには、ブラウザを開いて、chrome://inspect
にアクセスし、 "Open Dedicated DevTools for Node" を開きます。そうすれば接続できるアクティブな node インスタンスの一覧が表示されます。 上記のコマンドを実行した後、端末に表示されるアドレス(通常は localhost:9229
のようなもの)をクリックします。 ChromeのDevToolsを使ってJestをデバッグできます。
ChromeDeveloperToolsが表示され、Jest の CLIスクリプトの1行目にブレークポイントが設定されます(これは開発者ツールを開くための時間を設けて、その前に Jest が実行されてしまうのを防ぐためのものです)。 次の実行に進むには画面の上部右側にある再生ボタンのようなボタンをクリックします。 debugger
宣言を含むテストをJestが実行した場合、実行はポーズされ現在いのスコープとコールスタックを調べることができます。
Note: the
--runInBand
cli option makes sure Jest runs the test in the same process rather than spawning processes for individual tests. 通常Jestはプロセスをまたいで並列にテストを実行しますが、同時に複数のプロセスをデバッグするのは困難だからです。
VS Codeでデバッグする
There are multiple ways to debug Jest tests with Visual Studio Code's built-in debugger.
組み込みのデバッガを追加するには、前述した形でテストを実行して下さい。
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
そして以下の launch.json
の設定によりVS Codeのデバッガを追加して下さい:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}
自動的に起動してテストを実行するプロセスに追加するには、以下の構成を使用して下さい:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/.bin/jest",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"port": 9229
}
]
}
もしくは Windows の場合は以下を使用してください:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"port": 9229
}
]
}
Facebookのcreate-react-app
を使用しているなら、Jestのテストを以下の設定でデバッグできます:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": ["test", "--runInBand", "--no-cache", "--env=jsdom"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Nodeによるデバッグについての詳細はここで確認できます。
WebStormでのデバッグ
WebStorm で Jest のテストをデバッグする最も簡単な方法は、Jest run/debug configuration
を使用することです。 これによりテストを起動すると、自動的にデバッガがアタッチされます。
WebStorm の Run
メニューで Edit Configurations...
を選択します。 それから +
をクリックして、 Jest
を選択します。 オプションで Jest の設定ファイルや追加のオプション、そして環境変数を指定できます。 設定を保存し、コードにブレークポイントを設けて、緑色のデバッグアイコンをクリックしてデバッグを開始してください。
Facebook製の create-react-app
を使用しているなら、 Jest run/debug configuration でJest パッケージフィールドで react-scripts
のパスを指定し、Jest オプションフィールドに --env=jsdom
を追加してください。
キャッシュ関連の問題
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 = jest.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 yarn test (e.g. with create-react-app)
yarn test --runInBand
テスト実行時間を高速化するもう1つの案としてはTravis-CIのようなCIサーバでワーカーのプール数を最大4までに設定することです。 Travis-CIに特定すると、テストの実行時間を半分にできます。 注意: オープンソースプロジェクトで利用できるTravis-CIの フリープランは2CPUコアまでしか割り当てられません。
# Using Jest CLI
jest --maxWorkers=4
# Using yarn test (e.g. with create-react-app)
yarn 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!
In Jest 0.9.0, a new API jest.unmock
was introduced. Together with a plugin for babel, this will now work properly when using babel-jest
:
jest.unmock('./foo'); // Use unmock!
import foo from './foo';
// foo is not mocked!
babel のサポートを有効にする方法については、[Getting Started]GettingStarted.md#using-babel) を参照してください。
Jestをバージョン0.9.0にアップグレードするとテストが失敗するようになったのですが?
Jest is now using Jasmine 2 by default. It should be easy to upgrade using the Jasmine upgrade guide.
もしJasmine1を使い続けたいのなら、 testRunner
構成オプションを jasmine1
に設定するかコマンドラインオプションで --testRunner=jasmine1
を指定して下さい。
互換性の問題
JestはNodeバージョン6で追加された機能を利用します。 Nodeの最新の安定版リリースにアップグレードすることをお勧めします。 最低限サポートされているバージョンは、v6.0.0
です。 Versions 0.x.x
and 4.x.x
are not supported because the jsdom
version used in Jest doesn't support Node 4. しかし、JestをNode 4で使用する場合には、 Node 4 をサポートする jest-environment-node
のようなcustom environmentを使用するためにtestEnvironment
を設定することもできます。
coveragePathIgnorePatterns
が動作していない
babel-plugin-istanbul
プラグインを使用していないことを確認してください。 Jest は Istanbul をラップするため、カバレッジを収集するのにどのファイルを使用するのかを Istanbul に伝えます。 babel-plugin-istanbul
を使用した場合、Babel により処理される全てのファイルはカバレッジ収集用コードを備えているので、coveragePathIgnorePatterns
で無視されなくなります。
Defining Tests
Tests must be defined synchronously for Jest to be able to collect your tests.
As an example to show why this is the case, imagine we wrote a test like so:
// Don't do this it will not work
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);
When Jest runs your test to collect the test
s it will not find any because we have set the definition to happen asynchronously on the next tick of the event loop.
Note: This means when you are using test.each
you cannot set the table asynchronously within a beforeEach
/ beforeAll
.
まだ解決しませんか?
Help を参照してください。