Setup and Teardown
テストを書いている際にしばしば、テストを実行する前にいくつかのセットアップ作業をしたり、テストが終了した後にいくつかの仕上げ作業をしたい場合があります。 Jest はこれらを処理するヘルパー機能を提供します。
テストごとにセットアップ作業を繰り返し実行する #
多くのテストで繰り返し行う必要がある場合は、beforeEach
と afterEach
を使用します。
たとえば、いくつかのテストが City のデータベースと関係するとしましょう。 そしてこれらのテストの前に initializeCityDatabase()
を呼び出す必要があり、テストの後にはclearCityDatabase()
を呼び出す必要があるとします。 その場合、以下のようにできます:
beforeEach(() => { initializeCityDatabase(); }); afterEach(() => { clearCityDatabase(); }); test('city database has Vienna', () => { expect(isCity('Vienna')).toBeTruthy(); }); test('city database has San Juan', () => { expect(isCity('San Juan')).toBeTruthy(); });
beforeEach
と afterEach
は非同期コードをテストする と同様に非同期コードを扱えます - promise を返すか done
パラメータのどちらかを選択します。 たとえば、もし initializeCityDatabase()
が promiseを返すのであれば、データベースが初期化された際には promise が返されることが望まれます。
beforeEach(() => { return initializeCityDatabase(); });
ワンタイムセットアップ #
セットアップがファイルの先頭で一回だけ実行されることが必要なケースがあります。 そしてそのセットアップが非同期で行われる場合は特に面倒になり、あなたはそれをインラインで実行できません。 Jest はこの状況に対応するために beforeAll
と afterAll
を提供しています。
たとえば、initializeCityDatabase
と clearCityDatabase
が Promise オブジェクトを返し、City データベースがテスト間で再利用される場合、テストコードを以下のように変更することができます。
beforeAll(() => { return initializeCityDatabase(); }); afterAll(() => { return clearCityDatabase(); }); test('city database has Vienna', () => { expect(isCity('Vienna')).toBeTruthy(); }); test('city database has San Juan', () => { expect(isCity('San Juan')).toBeTruthy(); });
スコープ #
デフォルトでは before
と after
ブロックはファイルの中の各テストに適用されます。 一方であなたは describe
ブロックを使って複数のテストをグループ化することができます。 それらのブロックが describe
ブロックの中にあるときは、 before
と after
ブロックは describe
ブロックの中のテストにだけに適用されます。
たとえば、City だけでなく Food データベースも持っている場合に、別々のセットアップを別々のテストに対して行うことができます。
// Applies to all tests in this file beforeEach(() => { return initializeCityDatabase(); }); test('city database has Vienna', () => { expect(isCity('Vienna')).toBeTruthy(); }); test('city database has San Juan', () => { expect(isCity('San Juan')).toBeTruthy(); }); describe('matching cities to foods', () => { // Applies only to tests in this describe block beforeEach(() => { return initializeFoodDatabase(); }); test('Vienna <3 sausage', () => { expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true); }); test('San Juan <3 plantains', () => { expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true); }); });
一般的なアドバイス #
もしテストが失敗して、まず最初に調べるべきことの一つはそのテストが単体で実行された場合にも失敗するかどうかということです。 Jest では一つのテストのみをシンプルに実行することができます - それは一時的に test
コマンドを test.only
に変更するだけです。
test.only('this will be the only test that runs', () => { expect(true).toBe(false); }); test('this test will not run', () => { expect('A').toBe('A'); });
もしあなたがある程度の大きさのテストスイートを実行したときにあるテストが失敗し、そのテストを単独で実行したときには失敗しない場合は、おそらく別のテストがそのテストに干渉していると考えられます。 beforeEach
で共有されたステートをクリアすることでしばしばそういった問題を修正できます。 共有されたステートが変更されたかどうか確信がもてない場合は、beforeEach
を使ってデータのログを取得することもできます。