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

Фейковые таймеры и user-event

Вопрос

Тест поиска с debounce использует vi.useFakeTimers(). После этого await user.type(...) зависает. Как исправить?

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

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

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

Коротко

Правильный ответ: userEvent.setup({ advanceTimers: vi.advanceTimersByTime }). user-event между действиями делает задержки через таймеры.

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

  1. Отключить фейковые таймеры: они несовместимы с React 19 и act
  2. Использовать fireEvent вместо user-event: с фейковыми таймерами иначе нельзя
  3. Обернуть user.type в act из react-dom/test-utils
  4. userEvent.setup({ advanceTimers: vi.advanceTimersByTime })правильный ответ

Разбор

user-event между действиями делает задержки через таймеры. С фейковыми часами они никогда не истекают, если библиотеке не сказать, как двигать время. Опция advanceTimers решает это. Дальше vi.advanceTimersByTime(300) прокручивает debounce.

  • Фейковые таймеры с React работают.
  • fireEvent тоже обходной путь, но не единственный и не лучший.
  • react-dom/test-utils в React 19 больше не содержит act, и проблема не в act.

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

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