javascript - 使用 react-testing-library 和 jest 测试是否调用了 prop 函数
问题描述
我正在尝试编写一个简单的测试来验证当用户与几个按钮交互时是否调用了一个道具。这是我的测试:
it('submits the name on save', async () => {
const name = 'Some name'
const updatedName = 'New name'
const onSubmit = jest.fn()
render(
<EditableName name={name} onSubmit={onSubmit} />
)
act(() => {
fireEvent.click(getByText('Edit'))
fireEvent.change(getByRole('input'), { target: { value: updatedName } })
fireEvent.click(getByText('Save'))
})
expect(onSubmit).toBeCalledTimes(1)
})
结果:
● EditableName › submits the name on save
expect(jest.fn()).toBeCalledTimes(expected)
Expected number of calls: 1
Received number of calls: 0
当我console.log
查看呼叫的线路onSubmit
是否正在到达时,我可以看到它是。
我怀疑问题是onSubmit
我所期望的函数在我断言时是该函数的不同实例.toBeCalledTimes()
。由于我触发的三个事件导致组件重新渲染。
如何确保我在测试中作为道具传递的函数与被调用的函数相同?我需要使用spyOn
吗?如果是这样,怎么做?
提前致谢!
编辑:这是组件的最小代码示例:
import React, { useState } from "react";
import { Box, Button, TextField, Typography } from "@material-ui/core";
const EditableName = ({ name, onSubmit }) => {
const [editing, setEditing] = useState(false);
const [value, setValue] = useState(name);
const handleSubmit = () => {
onSubmit({ name: value });
};
const handleToggleEditMode = () => {
if (editing) {
setEditing(false);
setValue(name);
} else {
setEditing(true);
}
};
if (!editing) {
return (
<>
<Typography display="inline" variant="h5" component="h1">
{name}
</Typography>
<Button onClick={handleToggleEditMode}>
Edit
</Button>
</>
);
}
return (
<>
<TextField
name="name"
variant="outlined"
fullWidth
size="small"
label="Subsidy name"
value={value}
onChange={(e) => setValue(e.target.value)}
inputProps={{ role: "input" }}
/>
<Button onClick={handleSubmit}>Save</Button>
</>
);
};
export default EditableName;
解决方案
I think you need to separate the events, and act
is built into RTL so you need to use await waitFor
instead:
await waitFor(() => {
fireEvent.click(getByText('Edit'))
});
//should probably assert changes here
await waitFor(() => {
fireEvent.change(getByRole('input'), { target: { value: updatedName } })
});
//should probably assert changes here
await waitFor(() => {
fireEvent.click(getByText('Save'))
})
expect(onSubmit).toBeCalledTimes(1)
推荐阅读
- javascript - slack events api通过一条消息多次触发
- c# - docker JWT中的C#.net核心授权错误401未经授权
- regex - 正则表达式 - 如何将列表中的部分元素与 txt 文件中的模式匹配(处理中文字符)
- android - 多次接收动态链接
- jquery - 在文本框中显示来自数据库的建议单击
- reactjs - React redux:IntlProvider - 无法解析“react-intl-redux”打字稿
- android - 未收到多用户聊天邀请。
- git - bitbucket git ssh 密钥有问题
- loopbackjs - 定义 Loopback.io belongsTo 关系的正确方法
- neo4j - 密码查询以按关系计数检索节点顺序