fireEvent.click() (форма fireEvent) против element.click() (из JSDOM)

#click #jsdom #testing-library #user-event

Вопрос:

Контекст: Я использую библиотеку тестирования и пытаюсь понять некоторые из основных механизмов.

Поскольку JSDOM уже обеспечивает обработку события «щелчок», мне было интересно:

  • Есть ли разница между этими двумя способами управления событием?
  • Если нет, то почему fireEvent переопределяет это событие?

Если есть различия, я хотел бы понять, в чем они заключаются и когда следует использовать тот или иной инструмент.

(По второму вопросу у меня есть идея, но я хочу подтвердить: fireEvent предоставляет глобальный и унифицированный интерфейс для генерации событий. И щелчок-естественная его часть.)

Комментарии:

1. Переполнение стека-это решение проблем. Пожалуйста, будьте более конкретны в чем проблема

Ответ №1:

HTMLElement.click запускает событие щелчка

fireEvent.click запускает событие щелчка со свойствами события по вашему выбору (например detail: 2 )

Прямо из документов:

Примечание

В большинстве проектов есть несколько вариантов использования fireEvent, но в большинстве случаев вам, вероятно, следует использовать @testing-library/user-event.

userEvent.click запускает все события, которые должны произойти в браузере , если пользователь нажимает на элемент ( hover pointerdown , и т.д.)

Комментарии:

1. С вашим ответом я понимаю, что HTMLElement.click (управляемый JSDOM) и fireEvent.click (без указания каких-либо конкретных свойств события) похожи. Это правильно?

2. Примерно, да. Он также обертывает отправленное событие, если вы используете одну из библиотек, специфичных для платформы. Например act() , если вы используете @testing-library/react

3. О! Да! Он оборачивает события с. act() Спасибо, хорошая мысль.

Ответ №2:

Твоя догадка верна. Они даже говорят об этом в своих документах. Это просто «Удобные методы для запуска событий DOM». Вы можете увидеть полную карту событий (нажмите также) здесь: https://github.com/testing-library/dom-testing-library/blob/master/src/event-map.js