Тестування асинхронного коду
Асинхронний код є дуже поширеним в JavaScript. Коли у вас є код, який працює асинхронно, Jest повинен знати, коли код, що тестується, закінчив свою роботу перед тим, як перейти до наступного тесту. Jest дозволяє це зробити кількома способами.
Проміси
Просто поверніть проміс з вашого тесту і Jest чекатиме, поки він виконається. Якщо проміс буде відхилений, то тест впаде.
Наприклад, нехай fetchData
, повертатиме проміс, який повинен виконатися з рядком 'peanut butter'
. Ми можемо протестувати це так:
test('the data is peanut butter', () => {
return fetchData().then(data => {
expect(data).toBe('peanut butter');
});
});
Async/Await
Окрім того ви можете використовувати async
та await
у ваших тестах. Щоб написати асинхронний тест, використовуйте ключове слово async
перед початком функції, яка передається в test
. Наприклад, та сама функція fetchData
може бути протестована так:
test('the data is peanut butter', async () => {
const data = await fetchData();
expect(data).toBe('peanut butter');
});
test('the fetch fails with an error', async () => {
expect.assertions(1);
try {
await fetchData();
} catch (error) {
expect(error).toMatch('error');
}
});
Ви можете комбінувати async
і await
з .resolves
або .rejects
.
test('the data is peanut butter', async () => {
await expect(fetchData()).resolves.toBe('peanut butter');
});
test('the fetch fails with an error', async () => {
await expect(fetchData()).rejects.toMatch('error');
});
В цих випадках async
і await
виступають як синтаксичний цукор для тієї ж логіки, що використовують приклади з промісами.
Завжди переконуйтеся, що ви повертаєте проміс (або використовуєте await
). Якщо ви пропустите вираз return
/await
, то ваш тест закінчиться до того, як проміс, який повертається з fetchData
, виконається чи буде відхилений.
Якщо ви очікуєте, що проміс буде відхилено, використовуйте метод .catch
. Не забудьте додати expect.assertions
щоб переконатися, що певна кількість перевірок була виконана. В іншому випадку, виконаний проміс не викличе помилку теста.
test('the fetch fails with an error', () => {
expect.assertions(1);
return fetchData().catch(error => expect(error).toMatch('error'));
});