Setup and Teardown
Часто під час написання тестів є певна підотовча робота, яка повинна бути виконана перед запуском тестів а також певна фінальна робота, яка повинна бути виконана після запуску тестів. Jest надає допоміжні функції, щоб впоратись з цим.
Повторення налаштувань для багатьох тестів #
Якщо у вас певні задачі, які ви повинні виконувати щоразу для багатьох тестів, використовуйте beforeEach
і afterEach
.
Наприклад, припустимо, що кілька тестів взаємодіє з базою даних міст. У вас є метод 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
можуть обробляти асинхронний код так само, як і тести - отримуючи параметр done
або повертаючи проміс. Наприклад, якщо функція initializeCityDatabase()
повертає проміс, який виконається, коли база даних буде ініціалізована, ми можемо повернути цей проміс:
beforeEach(() => { return initializeCityDatabase(); });
Одноразове налаштування #
Інколи вам потрібно виконати налаштування перед тестами лише один раз на початку файла. Це може бути проблемою, якщо це налаштування асинхронне і, відповідно, ви не можете виконати його інлайново. Jest надає методи beforeAll
і afterAll
для використання в таких ситуаціях.
Наприклад, якщо initializeCityDatabase
і clearCityDatabase
повертають проміси і база даних міст може бути повторно використана в різних тестах, ми можемо змінити наш код на такий:
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
.
Наприклад, уявімо, що у нас є не тільки база даних міст, але і база даних їжі. Ми можемо розділити налаштування для різних тестів:
// 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
, в якому лише логуються дані.