javascript - Testing radio buttons in React 17 with Enzyme
问题描述
I have a React (v17.0.2) component that has a controlled form with radio buttons and a submit button. When a radio button is selected, the onRadioChange method is executed and sets the 'selected' state hook as the value of the selected radio button. This works as intended in the browser.
const Test = () => {
const beginner = 'Beginner';
const intermediate = 'Intermediate';
const expert = 'Expert';
const [selected, setSelected] = useState(beginner);
const formSubmit = (e) => {
e.preventDefault();
console.log('formSubmit executed');
//will dispatch actions
}
const onRadioChange = (e) => {
console.log('onRadioChange');
setSelected(e.target.value);
};
return (
<div className="form">
<form onSubmit={(e) => formSubmit(e)}>
<div className="radio">
<label id='beginner'>
<input
type="radio"
value={beginner}
checked={selected === beginner}
onChange={(e) => onRadioChange(e)}
/>
{beginner}
</label>
</div>
<div className="radio">
<label id='intermediate'>
<input
type="radio"
value={intermediate}
checked={selected === intermediate}
onChange={onRadioChange}
/>
{intermediate}
</label>
</div>
<div className="radio">
<label id='expert'>
<input
type="radio"
value={expert}
checked={selected === expert}
onChange={onRadioChange}
/>
{expert}
</label>
</div>
<div className="radio">
Selected option is : {selected}
</div>
<button className="submitradio" type="submit">
Submit
</button>
</form>
</div>
);
};
When I test it with Enzyme (v3.11.0) using an Adapter I found (@wojtekmaj/enzyme-adapter-react-17)...
it('should change the selected option when clicking on Intermediate', () => {
const radio = wrapper.find('#intermediate');
const selectedOne = wrapper.find('.selected');
expect(selectedOne.props().children[1]).toBe('Beginner');
radio.simulate('change', { target: { value: 'Intermediate' } });
const selectedTwo = wrapper.find('.selected');
expect(selectedTwo.props().children[1]).toBe('Intermediate')
});
...it doesn't fire 'onRadioChange'
Expected: "Intermediate"
Received: "Beginner"
35 |
36 | const selectedTwo = wrapper.find('.selected');
> 37 | expect(selectedTwo.props().children[1]).toBe('Intermediate')
| ^
38 | });
39 |
40 | });
at Object.<anonymous> (src/App.test.tsx:37:45)
Am I doing something wrong or is this a problem with the adapter?
解决方案
推荐阅读
- android - android从活动中的片段获取视图
- flutter - Flutter - TabBar中每个Tab的单独功能
- javascript - 哪个 gnome 函数负责切换工作区?
- amazon-web-services - 在 AWS Glue 中转换其他列的数据类型时,某些列变为空
- sql-server - 将 SQL 服务器转换为 Teradata 查询
- angular - Angular 测试 NavigationError 事件处理程序
- http - 关于 HttpException 没有被捕获
- javascript - 在javascript中,如果用户没有输入数字,如何使乘法表默认生成5或任何其他数字?
- python - 无法运行 python cmd 命令。引发语法错误
- android - firebase sendUnsentReports() 仅在重启后发送异常