Выбор ответа Junior Тестирование обновлено

Ожидание асинхронного элемента

Вопрос

Компонент загружает список с сервера и потом показывает «Найдено: 3». Тест падает с ошибкой «Unable to find an element». Как исправить?

render(<SearchResults query="чай" />);
expect(screen.getByText('Найдено: 3')).toBeInTheDocument();

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: expect(await screen.findByText('Найдено: 3'))... findBy возвращает промис и повторяет поиск, пока элемент не появится или не выйдет таймаут.

Варианты ответа

  1. expect(await screen.findByText('Найдено: 3'))...правильный ответ
  2. Перед проверкой await new Promise(r => setTimeout(r, 2000))
  3. Заменить getByText на queryByText
  4. Обернуть render в act без await

Разбор

findBy возвращает промис и повторяет поиск, пока элемент не появится или не выйдет таймаут. Это ожидание условия, а не фиксированного времени.

  • Фиксированный sleep делает тест медленным и всё равно флаки: на медленном CI 2 секунд может не хватить.
  • queryBy вернёт null сразу, данные ещё не пришли.
  • Синхронный act не дождётся асинхронной загрузки.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.