@ Решение BrianMitchL для насмешки метода persist
является хорошим, но важно добавить небольшой контекст о системе событий React и о том, почему вы видите поведение в первую очередь. События, передаваемые обработчикам в компонентах React, не являются собственными событиями браузера:
В ваши обработчики событий будут переданы экземпляры SyntheticEvent
, кросс-браузерной оболочки вокруг собственного события браузера. Он имеет тот же интерфейс, что и собственное событие браузера, включая stopPropagation()
и preventDefault()
, за исключением того, что события работают одинаково во всех браузерах.
По соображениям производительности React объединяет эти события :
Это означает, что объект SyntheticEvent
будет повторно использован и все свойства будут аннулированы после вызова обратного вызова события. Это из соображений производительности. Таким образом, вы не можете получить доступ к событию асинхронным способом.
Если вы хотите получить доступ к свойствам события асинхронным способом, вы должны вызвать event.persist()
для события, которое удалит синтезатор c событие из пула и разрешить сохранение ссылок на событие с помощью кода пользователя.
react-bootstrap-typeahead
использует event.persist()
для асинхронной передачи событий после установки внутреннего состояния. Например:
handleBlur = (event) => {
event.persist();
this.setState({ isFocused: false }, () => this.props.onBlur(event));
}
Вообще говоря, если в фиктивном событии, которое вы проходите в своем тесте, отсутствует атрибут, используемый в тестируемом коде, вы получите похожую ошибку. Как и в ответе @ BrianMitchL, вы можете просто смоделировать атрибут:
input.prop('onChange')({
defaultPrevented: false,
persist: () => {},
stopPropagation: () => {},
target: { ... }
});