reactjs - 如何使用 Jest 和 React 测试库测试功能性 React 组件的 clickHandler?
问题描述
我有一个功能按钮组件(从我的实际按钮组件中简化),clickHandler
只要单击它就会触发。如何测试该特定函数是否被调用?我知道我可以创建自己的const mockClickHandler = jest.fn();
并将其附加到按钮上,但我想测试 Button 组件中已经存在的处理程序。
// Button.jsx
const Button = () => {
const clickHandler = () => {
// code
}
render(
<button onClick={clickHandler}>
Click Me
</button>
)
}
// Button.spec.jsx
test('Click event functions properly', () => {
const { getByRole } = render(<Button />)
const button = getByRole('button');
// ...
})
解决方案
如果你通过 props 传递 clickHandler,你可以做这样的事情
it('calls "onClick" prop on button click', () => {
// Render new instance in every test to prevent leaking state
const onClick = jest.fn();
const { getByRole } = render(<Button onClick={onClick} />);
fireEvent.click(getByText(/click me nao/i));
expect(onClick).toHaveBeenCalled();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
如果您不想通过道具传递它,您可以测试单击后 DOM 会发生什么。
推荐阅读
- python - Python Sounddevice 播放字节
- python - 在同一图表上堆叠 bartplot 和线
- javascript - React Functional Component - 在 const vs state 中存储一些 prop 计算
- tensorflow - 有没有办法从 GPflow GPR 模型中检索权重?
- python - VSCode 说没有模块'matplotlib'
- angular - 当输入获得值Angular 9时组件发生变化
- python - 如何改进我的斐波那契数列生成器?
- sql - How to use group by in SQL?
- node.js - 使用 Multer 和 Mongodb 上传文件
- javascript - 使用 javascript 过滤待办事项列表中的活动任务、已完成任务和所有任务