Globals
テストファイルでは、Jest はそれぞれのメソッドとオブジェクトをグローバル環境に配置します。 それらを使用するために require または import する必要はありません。
メソッド
afterAll(fn, timeout)afterEach(fn, timeout)beforeAll(fn, timeout)beforeEach(fn, timeout)describe(name, fn)describe.only(name, fn)describe.skip(name, fn)test(name, fn, timeout)test.only(name, fn, timeout)test.skip(name, fn)
リファレンス
afterAll(fn, timeout)
このファイル内のすべてのテストが完了した後に、関数を実行します。 関数がpromiseまたはジェネレータを返した場合、Jestはそのpromiseが解決されるのを待ちます。
異常終了するまでの待ち時間を指定する timeout オプション(ミリ秒単位) を指定できます。 注意: デフォルトのタイムアウトは5秒です。
テスト間で共有するグローバルな設定や状態をクリーンアップしたい場合に便利です。
例:
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, timeout)
このファイル内の各テストが完了するたびに、関数を実行します。 関数がpromiseまたはジェネレータを返した場合、Jestはそのpromiseが解決されるのを待ちます。
異常終了するまでの待ち時間を指定する timeout オプション(ミリ秒単位) を指定できます。 注意: デフォルトのタイムアウトは5秒です。
各テストで一時的に設定した状態などをクリーンアップしたい場合に便利です。
例:
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, timeout)
このファイルのいずれかのテストを実行する前に、関数を実行します。 関数がpromiseまたはジェネレータを返した場合、Jestはテストを実行する前にpromiseが解決されるのを待ちます。
異常終了するまでの待ち時間を指定する timeout オプション(ミリ秒単位) を指定できます。 注意: デフォルトのタイムアウトは5秒です。
多数のテストで使用するグローバルな状態を設定したい場合に便利です。
例:
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, timeout)
ファイルの各テストが実行される前に、関数を実行します。 関数がpromiseまたはジェネレータを返した場合、Jestはテストを実行する前にpromiseが解決されるのを待ちます。
異常終了するまでの待ち時間を指定する timeout オプション(ミリ秒単位) を指定できます。 注意: デフォルトのタイムアウトは5秒です。
多数のテストで使用するグローバルな状態を設定したい場合に便利です。
例:
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) は、いくつかの関連するテストをまとめたブロックを作成します。 例えば、美味しくて酸っぱくないとされる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 はしばしば、テストの一部を一時的にコメントアウトする代わりになります。
test(name, fn, timeout)
次の別名でも同様となります: it(name, fn, timeout)
テストファイルに必要なのは、テストを実行する test メソッドだけです。 例えば、0でなければならない関数 inchesOfRain() があるとしましょう。 テストは以下のように書けます:
test('did not rain', () => {
expect(inchesOfRain()).toBe(0);
});
第1引数にテスト名を、第2引数にテストの確認項目を含む関数を設定します。 3番目の引数 (任意) は タイムアウト値 (ミリ秒単位) で、中止するまでの待ち時間を指定します。 注意: デフォルトのタイムアウトは5秒です。
注意:
testからPromiseが返された場合、Jestはテストが完了する前にPromiseの状態が決まるまで待ちます。 Jest は、通常はdoneと呼ばれるテスト関数に引数を与えた場合にも待ちます。 この動作はコールバックをテストしたい場合に便利です。 非同期なコードをテストする方法をこちらを参照してください。
例えば、 lemonを含むリストを取得することを期待されるPromise関数を返すfetchBeverageList() 関数があったとします。 以下のコードでテストできます:
test('has lemon in it', () => {
return fetchBeverageList().then(list => {
expect(list).toContain('lemon');
});
});
たとえtestブロックが直ちに値を返したとしても、テストはPromiseの状態が決まるまでは終了しません。
test.only(name, fn, timeout)
次の別名でも同様です: it.only(name, fn, timeout) と fit(name, fn, timeout)
大規模なテストファイルをデバッグする場合、テストのサブセットのみを実行したい場合がよくあります。 .only を使用して、そのテストファイルで実行したい唯一のテストを指定できます。
異常終了するまでの待ち時間を指定する timeout オプション(ミリ秒単位) を指定できます。 注意: デフォルトのタイムアウトは5秒です。
例えば、次のようなテストがあったとしましょう:
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を利用したほうが良いことがしばしばあります。