Jest предоставляет несколько способов обработки асинхронного кода в тестах. Вот основные методы:
1. Использование async/await
:
Этот метод позволяет писать асинхронный код в синхронном стиле, что упрощает чтение и понимание кода.
test('async test with async/await', async () => {
const data = await fetchData();
expect(data).toBe('peanut butter');
});
2. Использование ‘promise’ и .then()
:
Если ваш код возвращает промис, Jest будет ожидать его выполнения. Если промис отклоняется, тест автоматически завершается ошибкой.
test('async test with promises', () => {
return fetchData().then(data => {
expect(data).toBe('peanut butter');
});
});
3. Использование сопоставителей .resolves
и .rejects
:
Эти сопоставители позволяют тестировать разрешение или отклонение промисов без необходимости использовать синтаксис async/await
.
test('async test with resolves', () => {
return expect(fetchData()).resolves.toBe('peanut butter');
});
test('async test with rejects', () => {
return expect(fetchData()).rejects.toThrow('error');
});
4. Использование функции обратного вызова done
:
Эта функция передается в качестве аргумента в тестовую функцию. Вы можете вызвать эту функцию, когда ваш асинхронный код будет завершен, и Jest будет ждать ее вызова перед завершением теста.
test('async test with done', done => {
fetchData().then(data => {
expect(data).toBe('peanut butter');
done();
});
});
5. Использование setTimeout
:
Функция setTimeout
может использоваться для приостановки выполнения теста на заданное время, что полезно для ожидания перед выполнением теста.
test('async test with setTimeout', done => {
setTimeout(() => {
expect(true).toBe(true);
done();
}, 1000);
});
6. Использование waitFor
из React Testing Library:
Если вы тестируете React-компоненты, вы можете использовать waitFor
для ожидания определенного состояния или события.
import { render, screen, waitFor } from '@testing-library/react';
import MyComponent from './MyComponent';
test('async test with waitFor', async () => {
render(<MyComponent />);
await waitFor(() => expect(screen.getByText('Loaded')).toBeInTheDocument());
});