セットアップと破棄
テストを書いている際にしばしば、テストを実行する前にいくつかのセットアップ作業をしたり、テストが終了した後にいくつかの仕上げ作業をしたい場合があります。 Jest はこれらを処理するヘルパー機能を提供します。
#
テストごとにセットアップ作業を繰り返し実行する多くのテストで繰り返し行う必要がある場合は、beforeEach
と afterEach
を使用します。
たとえば、いくつかのテストが City のデータベースと関係するとしましょう。 そしてこれらのテストの前に initializeCityDatabase()
を呼び出す必要があり、テストの後にはclearCityDatabase()
を呼び出す必要があるとします。 その場合、以下のようにできます:
beforeEach
と afterEach
は非同期コードをテストする と同様に非同期コードを扱えます - promise を返すか done
パラメータのどちらかを選択します。 たとえば、もし initializeCityDatabase()
が promiseを返すのであれば、データベースが初期化された際には promise が返されることが望まれます。
#
ワンタイムセットアップセットアップがファイルの先頭で一回だけ実行されることが必要なケースがあります。 このセットアップが非同期で行われる場合は特に面倒になるので、インラインでは実施できません。 Jest はこの状況に対応するために beforeAll
と afterAll
を提供しています。
たとえば、initializeCityDatabase
と clearCityDatabase
が Promise オブジェクトを返し、City データベースがテスト間で再利用される場合、テストコードを以下のように変更することができます。
#
スコープデフォルトでは before
と after
ブロックはファイルの中の各テストに適用されます。 一方であなたは describe
ブロックを使って複数のテストをグループ化することができます。 それらのブロックが describe
ブロックの中にあるときは、 before
と after
ブロックは describe
ブロックの中のテストにだけに適用されます。
For example, let's say we had not just a city database, but also a food database. We could do different setup for different tests:
最上位の beforeEach
は describe
内の beforeEach
より前に実行されることに注意してください。 以下のコードを実行すると、全フックの順序が理解できると思います。
#
describe ブロックと test ブロックの実行順序Jest は、テストファイル内のすべての describe ハンドラを、実際のすべてのテストを実行する前に実行します。 これが、セットアップとティアダウンを describe ブロックではなく、before*
および after*
ハンドラの中で実行するもう一つの理由です。 describe ブロックの実行完了後に、デフォルトのでは、 Jest はコレクションフェーズで発見したテストを順番に直列に実行します。 次のテストに移動する前に、それぞれのテストが完了して片付けが終わるまで待ちます。
次のような説明のためのテストファイルとその出力について見てみましょう。
#
一般的なアドバイスもしテストが失敗して、まず最初に調べるべきことの一つはそのテストが単体で実行された場合にも失敗するかどうかということです。 Jest で一度だけテストを実行するには、 test
コマンドを test.only
に一時的に変更します。
もしあなたがある程度の大きさのテストスイートを実行したときにあるテストが失敗し、そのテストを単独で実行したときには失敗しない場合は、おそらく別のテストがそのテストに干渉していると考えられます。 beforeEach
で共有されたステートをクリアすることでしばしばそういった問題を修正できます。 共有されたステートが変更されたかどうか確信がもてない場合は、beforeEach
を使ってデータのログを取得することもできます。