#reactjs #jestjs #enzyme
Вопрос:
У меня есть компонент Reactjs, и в нем есть одна кнопка и средство выбора диапазона дат. Я хочу смоделировать события onclick и onchange для кнопки и средства выбора соответственно. Я могу имитировать нажатие кнопки. но при смене датапикера не работает
Я уже пробовал это
headerComponent.find(`#prev_button`).at(1).simulate("click");
headerComponent.find(`#dropdown`).at(1).simulate("change", { value: "t" });
пожалуйста, посмотрите эту песочницу, нажмите здесь, чтобы получить полный код и тестовый файл
Ответ №1:
Основываясь на документации по ферменту, вы допускаете ошибку во втором аргументе simulate
функции.
Чтобы смоделировать изменения на входе, вы должны изменить его следующим образом :
headerComponent.find(`#dropdown`).at(1).simulate("change", { target: { value: "t" } });
Комментарии:
1. все равно это не работает. можете ли вы попробовать в песочнице ? @marzzy
Ответ №2:
Тестирование с помощью фермента-сложная задача. Вы должны стараться не тестировать зависимости, потому что вы уверены, что они уже протестированы. Сказав это, вы могли бы выполнить неглубокую визуализацию вместо монтирования и поиска RangePicker
компонента в неглубоком дереве, получить обработчик, который вы передаете в onChange
опоре, и вызвать его вручную, затем проверьте, что опора обратного вызова, которую вы передаете своему компоненту, вызывается с ожидаемым значением.
describe.only("test", () => {
it("should render", () => {
const callBackToSetDates = jest.fn();
const callBackToSetFilter = jest.fn();
const wrapper = shallow(
<Header
{...headerProps1}
callBackToSetDates={callBackToSetDates}
callBackToSetFilter={callBackToSetFilter}
/>
);
const rangePickerOnChange = wrapper.find("RangePicker").prop("onChange");
rangePickerOnChange("someValue");
expect(callBackToSetDates).toHaveBeenCalledWith("someValue");
});
});
цель состоит в том, чтобы протестировать только логику, которую вы добавляете в свой компонент, т. Е. Вы преобразуете значение, полученное из RangePicker, во что-то другое
<RangePicker
...
onChange={(value) => {
callBackToSetDates(`I'm transforming ${value}`);
}}
/>
и в вашем тесте
rangePickerOnChange("someValue");
expect(callBackToSetDates).toHaveBeenCalledWith("I'm transforming someValue");
вы можете увидеть, как это работает здесь https://codesandbox.io/s/cool-rosalind-uec6t?file=/src/tests/index.test.js
Если вы действительно хотите продолжать проверять, что видит фактический пользователь, вам нужно будет запускать события, которые пользователь выполняет при использовании компонента. В этом случае: вам нужно щелкнуть ввод, найти дату, щелкнуть ее, затем щелкнуть другую дату, чтобы полностью запустить onChange
событие RangePicker
компонента. Вы можете посмотреть, как antd тестирует его и копирует необходимую конфигурацию jest, которую они должны использовать для создания некоторых API DOM