Имитация фермента работает подобно .simulate («click») фактически ищет функцию onClick и передает ей параметры, при этом «фактический» щелчок не происходит
Таким образом, фермент не будет имитировать триггер при события, добавленные непосредственно… вам, возможно, придется go отправить событие Event самим.
component.getDOMNode (), чтобы получить узел DOM, на котором должен работать dispatchEvent. Что-то вроде ниже
it('simulate escape event', () => {
const component = mount(<Component />);
const event = new Event('keydown');
event.keyCode = 27;
component.getDOMNode().dispatchEvent(event);
// assertion of things that are handled on escape
});
Также еще одна проблема, которую я вижу, состоит в том, что массив зависимостей в useEffect. Удалите зависимость пустого массива в useEffect, чтобы сохранить его в безопасности, когда элемент dom иногда изменяется между реактивными повторными рендерингами.
useEffect(() => {
ref.current?.addEventListener('keydown', handleEvent);
return () => {
ref.current?.removeEventListener('keydown', handleEvent);
}
});
Вы присоединяете eventHandler только при монтировании компонента.
Но элемент DOM может меняться между реагирующими рендерингами, поэтому вы должны фактически прикрепить eventListener во все useEffects, которые запускаются после рендеринга реагирования и обновлений DOM в жизненном цикле реакции.
U также может полагаться на callBackRefs , если вы думаете, что в элементе DOM будет что-то дорогое, и не хотите, чтобы оно выполнялось при каждом использовании useEffects.
Для простого подключения прослушивателей событий этот useEffect без массива зависимостей должен подойти.