← Назад ко всем вопросам

Как тестировать асинхронный код в Jest/Mocha? (done/return Promise/async-await)

1️⃣ Как кратко ответить

В Jest и Mocha асинхронный код можно тестировать тремя способами: с использованием коллбэка done, возвратом Promise из теста или применением async/await. done используется для сигнализации о завершении теста, возврат Promise позволяет Jest/Mocha дождаться его разрешения, а async/await упрощает работу с асинхронным кодом, делая его более читаемым.

2️⃣ Подробное объяснение темы

Тестирование асинхронного кода в Jest и Mocha требует понимания того, как эти фреймворки обрабатывают асинхронные операции. Асинхронный код может включать в себя операции, такие как HTTP-запросы, таймеры или взаимодействие с базой данных. Чтобы корректно протестировать такие операции, необходимо убедиться, что тесты дожидаются их завершения.

Использование коллбэка done

В Jest и Mocha можно использовать коллбэк done для сигнализации о завершении асинхронного теста. Это полезно, когда вы работаете с асинхронными функциями, которые не возвращают Promise.

test('тест с использованием done', (done) => {
  setTimeout(() => {
    expect(true).toBe(true);
    done(); // Сообщаем Jest, что тест завершен
  }, 100);
});

В этом примере setTimeout используется для имитации асинхронной операции. Коллбэк done вызывается после завершения операции, что сигнализирует Jest о том, что тест завершен.

Возврат Promise

Если асинхронная функция возвращает Promise, можно просто вернуть этот Promise из теста. Jest и Mocha будут ожидать его разрешения или отклонения.

test('тест с возвратом Promise', () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      expect(true).toBe(true);
      resolve(); // Разрешаем Promise, что завершает тест
    }, 100);
  });
});

Здесь Promise возвращается из теста, и Jest ждет его разрешения, прежде чем считать тест завершенным.

Использование async/await

async/await делает работу с асинхронным кодом более простой и читаемой. Тестовая функция объявляется как async, и внутри нее можно использовать await для ожидания разрешения Promise.

test('тест с использованием async/await', async () => {
  await new Promise((resolve) => {
    setTimeout(() => {
      expect(true).toBe(true);
      resolve(); // Разрешаем Promise
    }, 100);
  });
});

В этом примере await используется для ожидания разрешения Promise, что делает код более линейным и понятным.

Применение на практике

Тестирование асинхронного кода важно для обеспечения корректной работы приложений, особенно когда они взаимодействуют с внешними сервисами или выполняют длительные операции. Использование done, возврата Promise и async/await позволяет гибко подходить к тестированию в зависимости от структуры и требований вашего кода.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки