Globals
Під час виконання тестів, Jest додає кожен з цих методів і об’єктів в глобальну область видимості. Вам не потрібно нічого підключати або імпортувати, щоб їх використовувати.
Методи #
Довідка #
afterAll(fn)
#
Запускає функцію, після того, як завершилися всі тести в цьому файлі. Якщо функція повертає проміс, Jest очікує на виконання цього промісу, перш ніж продовжити роботу.
Це часто буває корисним якщо ви хочете очистити певний глобальний стан, спільний для різних тестів.
Наприклад:
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
, він виконується в кінці цього блоку тестів.
Якщо ви хочете виконувати очистку після кожного тесту, використовуйте afterEach
взамін.
afterEach(fn)
#
Запускає функцію після закінчення кожного тесту в цьому файлі. Якщо функція повертає проміс, Jest очікує на виконання цього промісу, перш ніж продовжити роботу.
Це часто буває корисним якщо ви хочете очистити певний тимчасовий стан, створений кожним з тестів.
Наприклад:
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
, він виконується лише після кожного тесту всередині цього блоку.
Якщо ви хочете виконувати певну очистку тільки один раз після виконання всіх тестів, використовуйте afterAll
.
beforeAll(fn)
#
Запускає функцію перед виконанням тестів в цьому файлі. Якщо функція повертає проміс, Jest очікує на виконання цього промісу, перш ніж запускати тести.
Це часто буває корисним якщо ви хочете встановити певний глобальний стан, який буде використовуватися кількома тестами.
Наприклад:
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 чекатиме, поки виконається проміс, що дозволяє використання асинхронних налаштувань.
Якщо beforeAll
знаходиться всередині блоку describe
, він виконується на початку цього блоку тестів.
Якщо ви хочете виконувати якісь команди перед запуском кожного тесту, використовуйте beforeEach
взамін.
beforeEach(fn)
#
Запускає функцію перед виконанням кожного тесту в цьому файлі. Якщо функція повертає проміс, Jest очікує на виконання цього промісу, перш ніж запускати тест.
Це часто буває корисним якщо ви хочете перевстановити певний глобальний стан, який буде використовуватися кількома тестами.
Наприклад:
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
, він виконується перед кожним тестом в цьому блоці.
Якщо вам потрібно виконати певні налаштування лише один раз перед запуском всіх тестів, використовуйте beforeAll
взамін.
describe(name, fn)
#
describe(name, fn)
створює блок, який групує кілька взаємомопов’язаних тестів в один набір тестів. Наприклад, якщо у вас є об’єкт myBeverage
який повинен мати властивість delicious
і не мати властивості sour
, ви можете протестувати це так:
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('given a valid binary string', () => { test('returns the correct number', () => { expect(binaryStringToNumber('100')).toBe(4); }); }); });
describe.only(name, fn)
#
Також має псевдонім fdescribe(name, fn)
Ви можете використовувати describe.only
, якщо ви хочете виконати лише один блок describe
:
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.skip
, якщо ви не хочете запускати тести з певного блоку describe
:
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)
#
Повертає мок реалізацію модуля замість актуального модуля, ігноруючи всі перевірки того, чи повинен модуль підключатися як звичайно, чи ні.
test(name, fn)
#
Також має псевдонім it(name, fn)
Все, що вам потрібно в файлі з тестами - це метод test
, який запускає тести. Наприклад, увімо, що є функція inchesOfRain()
, яка повинна повертати нуль. Ваш тест може бути таким:
test('did not rain', () => { expect(inchesOfRain()).toBe(0); });
Перший аргумент - це назва тесту, другий - функція, яка містить очікування, які потрібно перевірити.
Якщо test
повертає проміс, Jest буде очікувати на його виконання перед тим, як дати тесту закінчитися.
Наприклад, нехай fetchBeverageList()
повертає проміс, який повинен виконатися зі списком, що містить lemon
:
test('has lemon in it', () => { return fetchBeverageList().then(list => { expect(list).toContain('lemon'); }); });
Незважаючи на те, що test
відразу поверне значення, тест не буде виконано, поки не буде виконано проміс.
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); });
Лише тест "it is raining" буде виконано, оскільки він запускається з test.only
.
Зазвичай вам не потрібно додавати код, який використовує 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); });
Лише тест "it is raining" буде виконано, оскільки інший тест запускається з test.skip
.
Ви би могли просто закоментувати теста, але часто краще використовувати test.skip
, оскільки це зберігає відступи і підсвітку синтаксису.