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());
});