сложно спекулировать без реального кода (я имею в виду render()
метод).
Предположим, это выглядит так (я пропустил переключатель / регистр, чтобы сделать его короче)
updateState = ({target: { value, id }}) => {
this.setState({
[id]: value,
});
}
render() {
return (<>
<input value={this.state.email} id="email" onChange={this.updateState} />
<input value={this.state.firstName} id="firstName" onChange={this.updateState} />
<input value={this.state.lastName} id="lastName" onChange={this.updateState} />
<input value={this.state.age} id="age" onChange={this.updateState} />
<div id="raw_output">{JSON.stringify(this.state)}</div>
</>);
}
Тогда, чтобы сосредоточиться на тестировании render()
, результат не требует, чтобы вы высмеивали какие-либо функции:
function updateFieldById(wrapper, id, value) {
wrapper.find(id).simulate('change', { target: { id, value } });
}
it('updates state after each field changed', () => {
const wrapper = shallow(<Comp />);
// checking start output with default input
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'email', '_email_mock_');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'firstName', '_fn_mock_');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'lastName', '_ln_mock_');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
updateFieldById(wrapper, 'age', '999');
expect(wrapper.find('#raw_input').props().children).toMatchSnapshot();
});
Конечно, вместо использования toMatchSnapshot()
вы можете проверить существование любого элемента или проверить конкретное текстовое значение, например
expect(wrapper.find('#fullName').props().children).toEqual('firstName lastName');
Также вы можете разделить тестовый набор на отдельные поля.