#javascript #testing #reactjs #enzyme
#javascript #тестирование #reactjs #фермент
Вопрос:
Можно использовать метод Enzyme .simulate() для пользовательских событий. Например:
// Code
<Element onFoo={someFunction}></Elements>
// Test
const element = shallow(<Element>);
element.simulate('foo');
Следует ли таким образом тестировать пользовательские события с помощью Enzyme или это лучший подход к использованию s.th . как:
//Test
const element = shallow(<Element>);
element.props.onFoo()
Ответ №1:
Похоже, что .simulate()
для пользовательских событий это не реализовано. Существует проблема на github, где обсуждается эта тема, и один из сопровождающих Enzyme предлагает использовать второй подход, который вы предоставили:
wrapper.find(Child).prop('customEvent')(fakeEvent)
Комментарии:
1. Спасибо за ваш ответ. simulate() работает для пользовательских событий до тех пор, пока перед ним находится on.. (например, onFoo). Я просто сомневаюсь, приведут ли изменения api к сбою моих тестов, потому что я «неправильно использую» метод simulate(), или это не неправильное использование, и реализация прекрасна как есть.
Ответ №2:
Вы можете использовать .simulate()
для пользовательских событий. Есть уловка, которую вы должны использовать on
в качестве префикса для пользовательского события. Например onJump
, onAdd
так вы должны называть свои пользовательские события.
element.props.onFoo()
в приведенном выше случае на самом деле не тестируется функциональность. Он проверяет только внутренние компоненты компонента, поэтому привязка остается непроверенной. Также становится сложно провести рефакторинг, поскольку реализация связана с тестовым кодом.
Вы можете обратиться к этому блогу для рабочей демонстрации сценария и того, как можно протестировать компоненты, имеющие пользовательские события.
Ответ №3:
В дополнение к другим ответам, если вы тестируете родительский компонент, который использует ваш Element
компонент:
Не уверен, что это также зависит от версии. Но я работаю с enzyme 2.9.1, и именно так я добиваюсь запуска дочерней пользовательской функции:
wrapper.find(Child).prop('customEvent')(/*args*/)
Ответ №4:
Но разве это на самом деле уже не работает в текущем мелком рендеринге?
/* Film component */
render() {
return (
...
<FilmHeader onSearchClick={this.handleSearchClick}>
...
)
}
/* Test */
const wrapper = shallow(<Film {...props} />);
wrapper.find('FilmHeader').simulate('searchClick');
Вышеупомянутая проблема с ферментом все еще открыта. И в документации не указано ничего очевидного об этой функции. Так что, возможно, проблема в самой документации.
Комментарии:
1. Приведенный выше код отлично работает для меня, по крайней мере, с Enzyme 3 и React 16.
2. @KARTHIKEYAN A., не уверен, что я понял вашу
., may be in previously.
правку, не могли бы вы перефразировать, пожалуйста?
Ответ №5:
Что сработало для меня, пытаясь создать пользовательское событие для компонента, который не является компонентом верхнего уровня, было следующим:
const myComponent = enzymeWrapper.find('MyComponent');
myComponent.node.onThingSelected({}, { thing: newThing});
Где MyComponent — это компонент React, onThingSelected — это пользовательский обработчик событий, точно названный в компоненте, а newThing — это объект типа, ожидаемого обработчиком событий.