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

Назад