Globals
Jestはテストファイル内に以下のメソッドとオブジェクトをグローバル環境に配置します。これらを利用するのに何かをimportしたりrequireする必要はありません。
メソッド #
リファレンス #
afterAll(fn)
#
ファイル内のテスト完了後に実行される関数です。関数がPromiseを返した場合、Jestは次の処理に移る前にそのPromiseの状態が決まるまで待ちます。
テスト間で共有するグローバルな設定や状態をクリーンアップしたい場合に便利です。
例:
const globalDatabase = makeGlobalDatabase(); function cleanUpDatabase(db) { db.cleanUp(); } afterAll(() => { cleanUpDatabase(globalDatabase); }); test('can find things', () => { return globalDatabase.find('thing', {}, results => { expect(results.length).toBeGreaterThan(0); }); }); test('can insert a thing', () => { return globalDatabase.insert('thing', makeThing(), response => { expect(response.success).toBeTruthy(); }); });
この例では afterAll
関数はファイル内の全てのテストが完了した後にcleanUpDatabase
を必ず実行します。
afterAll
関数 が describe
ブロック内に記述された場合は、 そのブロックの最後にafterAll
関数が実行されます。
全テスト完了後ではなく、個々のテストの完了後にクリーンアップ処理を行いたい場合は、 afterEach
関数を使用して下さい。
afterEach(fn)
#
ファイル内の個々のテストが完了するごとに実行される関数です。関数がPromiseを返した場合、Jestは次の処理に移る前にそのPromiseの状態が決まるまで待ちます。
各テストで一時的に設定した状態などをクリーンアップしたい場合に便利です。
例:
const globalDatabase = makeGlobalDatabase(); function cleanUpDatabase(db) { db.cleanUp(); } afterEach(() => { cleanUpDatabase(globalDatabase); }); test('can find things', () => { return globalDatabase.find('thing', {}, results => { expect(results.length).toBeGreaterThan(0); }); }); test('can insert a thing', () => { return globalDatabase.insert('thing', makeThing(), response => { expect(response.success).toBeTruthy(); }); });
この例では afterEach
関数はファイル内の各テストが完了するごとにcleanUpDatabase
を必ず実行します。
afterEach
関数 が describe
ブロック内に記述された場合は、 afterEach
関数が記述されたブロックのみ、最後に実行されます。
全テストが完了した後に一度だけ何らかのクリーンアップを実行する場合は、 afterAll
関数を使用して下さい。
beforeAll(fn)
#
ファイル内の全てのテストを開始する前に実行される関数です。関数がPromiseを返した場合、Jestはテストを開始する前にそのPromiseの状態が決まるまで待ちます。
多数のテストで使用するグローバルな状態を設定したい場合に便利です。
例:
const globalDatabase = makeGlobalDatabase(); beforeAll(() => { // Clears the database and adds some testing data. // Jest will wait for this promise to resolve before running tests. return globalDatabase.clear().then(() => { return globalDatabase.insert({testData: 'foo'}); }); }); // Since we only set up the database once in this example, it's important // that our tests don't modify it. test('can find things', () => { return globalDatabase.find('thing', {}, results => { expect(results.length).toBeGreaterThan(0); }); });
この例ではbeforeAll
はテスト開始前に必ずデータベースのセットアップを行います。 セットアップが同期処理の場合は、 beforeAll
を使用する必要はありません。 この関数の要点はJestがPromiseの状態が決まるまで待つことであり、非同期処理によるセットアップが行えるということであるとも言えます。
beforeAll
関数 が describe
ブロック内に記述された場合は、 そのブロックの最初に beforeAll
関数が実行されます。
全テスト開始前ではなく、個々のテストの開始前に何らかの処理を行いたい場合は、 beforeEach
関数を使用して下さい。
beforeEach(fn)
#
ファイル内の個々のテストをそれぞれが開始される前に実行される関数です。関数がPromiseを返した場合、Jestはテストを開始する前にそのPromiseの状態が決まるまで待ちます。
多数のテストで使用するグローバルな状態を設定したい場合に便利です。
例:
const globalDatabase = makeGlobalDatabase(); beforeEach(() => { // Clears the database and adds some testing data. // Jest will wait for this promise to resolve before running tests. return globalDatabase.clear().then(() => { return globalDatabase.insert({testData: 'foo'}); }); }); test('can find things', () => { return globalDatabase.find('thing', {}, results => { expect(results.length).toBeGreaterThan(0); }); }); test('can insert a thing', () => { return globalDatabase.insert('thing', makeThing(), response => { expect(response.success).toBeTruthy(); }); });
この例ではbeforeEach
関数は個々のテストを開始する前に必ずデータベースのリセットを行います。
beforeEach
関数 が describe
ブロック内に記述された場合は、 各ブロックの最初に beforeEach
関数が実行されます。
何らかのセットアップ コードを 一度だけ実行したい場合は、 beforeAll
関数を使用してください。
describe(name, fn)
#
describe(name, fn)
は複数の関連したテストを1つの「テストスイート」としてグループ化したブロックを作成します。 例えば、美味しくて酸っぱくないとされるmyBeverage
オブジェクトがある場合、このようなテストコードを作成できます:
const myBeverage = { delicious: true, sour: false, }; describe('my beverage', () => { test('is delicious', () => { expect(myBeverage.delicious).toBeTruthy(); }); test('is not sour', () => { expect(myBeverage.sour).toBeFalsy(); }); });
これは必ずしも必要ではありません - トップレベルに test
ブロックを直接記述することもできます。しかしテストをグループごとに整理したい場合には便利です。
テストに階層構造を持たせたい場合でも describe
をネストすることができます。
const binaryStringToNumber = binString =>; { if (!/^[01]+$/.test(binString)) { throw new CustomError('Not a binary number.'); } return parseInt(binString, 2); }; describe('binaryStringToNumber', () =>; { describe('given an invalid binary string', () =>; { test('composed of non-numbers throws CustomError', () =>; { expect(() =>; binaryStringToNumber('abc')).toThrowError(CustomError); }); test('with extra whitespace throws CustomError', () =>; { expect(() =>; binaryStringToNumber(' 100')).toThrowError(CustomError); }); });
describe.only(name, fn)
#
次の別名でも同様となります: fdescribe(name, fn)
1つのdescribeブロックだけを実行したい場合には describe.only
を使用して下さい:
describe.only('my beverage', () => { test('is delicious', () => { expect(myBeverage.delicious).toBeTruthy(); }); test('is not sour', () => { expect(myBeverage.sour).toBeFalsy(); }); }); describe('my other beverage', () => { // ... will be skipped });
describe.skip(name, fn)
#
次の別名でも同様となります: xdescribe(name, fn)
特定ののdescribeブロックを実行したくない場合には describe.skip
を使用して下さい:
describe('my beverage', () => { test('is delicious', () => { expect(myBeverage.delicious).toBeTruthy(); }); test('is not sour', () => { expect(myBeverage.sour).toBeFalsy(); }); }); describe.skip('my other beverage', () => { // ... will be skipped });
多くの場合でdescribe.skip
を使うことにより、テストの塊をコメントアウトする作業を簡単に代替することができます。
require.requireActual(moduleName)
#
モジュールがモックしたものを受け取る設定であるかを確認せず、モックではない本物のモジュールを返すようになります。
require.requireMock(moduleName)
#
モジュールが通常通りrequireされるかを確認せず、本物のモジュールではないモックを返すようになります。
test(name, fn)
#
次の別名でも同様となります: it(name, fn)
テストの実行に絶対に必要となるのは test
メソッドだけです。例えば、ゼロを返べき inchesOfRain()
関数があったとしましょう。テスト全体は次のようになります:
test('did not rain', () => { expect(inchesOfRain()).toBe(0); });
第1引数にテスト名を、第2引数にテストの確認項目を含む関数を設定します。
test
からPromiseが返された場合、Jestはテストが完了する前にPromiseの状態が決まるまで待ちます。
例えば、 lemon
を含むリストを取得することを期待されるPromise関数を返すfetchBeverageList()
関数があったとします。次のようにテストできます:
test('has lemon in it', () => { return fetchBeverageList().then(list => { expect(list).toContain('lemon'); }); });
たとえtest
ブロックが直ちに値を返したとしても、テストはPromiseの状態が決まるまでは終了しません。
test.only(name, fn)
#
次の別名でも同様です: it.only(name, fn)
または fit(name, fn)
大きなコードベースをデバッグする時、テストの一部だけを実行したいことがあるでしょう。.only
を使用することで実行したいテストだけを行うことができます。
例えば、次のようなテストがあったとしましょう:
test.only('it is raining', () => { expect(inchesOfRain()).toBeGreaterThan(0); }); test('it is not snowing', () => { expect(inchesOfSnow()).toBe(0); });
test.only
があるテストだけが実行されるので、"it is raining"のテストだけが実行されます。
通常はテストの動作を管理する手段としてtest.only
を用いることはないでしょう - デバッグ作業のために使用し、壊れているテストを修復すれば削除することでしょう。
test.skip(name, fn)
#
次の別名でも同様です: it.skip(name, fn)
または xit(name, fn)
または xtest(name, fn)
大きなコードベースを保守するとき、何らかの理由で一時的に壊れているテストを見つけることがあるでしょう。 テストコードを削除せずにスキップしたい場合、test.skip
を使って特定のテストをスキップできます。
例えば、次のようなテストがあったとしましょう:
test('it is raining', () => { expect(inchesOfRain()).toBeGreaterThan(0); }); test.skip('it is not snowing', () => { expect(inchesOfSnow()).toBe(0); });
他のテストにはtest.skip
があるので、"it is raining"のテストだけが実行されます。
単にテストをコメントアウトすることもできますが、テストが存在することとシンタックスハイライトを維持できるため、 test.skip
を利用したほうが良いことがしばしばあります。