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

Забытый await у user-event

Вопрос

Тест падает: обработчик не вызван. Что исправить?

test('сохраняет', async () => {
  const user = userEvent.setup();
  const onSave = vi.fn();
  render(<Editor onSave={onSave} />);
  user.click(screen.getByRole('button', { name: 'Сохранить' }));
  expect(onSave).toHaveBeenCalled();
});

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

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

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

Коротко

Правильный ответ: user.click асинхронный, нужен await. user.click возвращает промис: внутри он последовательно генерирует pointer- и mouse-события.

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

  1. Заменить userEvent на fireEvent, он надёжнее
  2. Обернуть render в act, иначе клик не обработается
  3. user.click асинхронный, нужен awaitправильный ответ
  4. Добавить data-testid кнопке, чтобы клик попал в неё

Разбор

user.click возвращает промис: внутри он последовательно генерирует pointer- и mouse-события. Без await строка с expect выполняется до клика.

  • fireEvent синхронный, но проверяет меньше реального поведения; проблема тут не в нём.
  • RTL сам оборачивает render в act.
  • Test id ни на что не влияет: кнопка уже находится по роли.

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

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