【发布时间】:2021-11-27 21:58:51
【问题描述】:
我正在尝试编写一个简单的测试来验证当用户与几个按钮交互时调用了一个道具。这是我的测试:
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的线路是否正在到达时,我可以看到它是。
我怀疑问题在于,当我断言 .toBeCalledTimes() 时,我期望的 onSubmit 函数是该函数的不同实例。由于我触发的三个事件导致组件重新渲染。
如何确保我在测试中作为道具传递的函数与被调用的函数相同?我需要使用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;
【问题讨论】:
-
onSubmit 真的是一个道具吗?你在测试什么 - 给minimal reproducible example。
-
刚刚发布。谢谢。
标签: javascript reactjs testing jestjs react-testing-library