我正在写一个测试,以确保我的表单是使用react测试库提交的,我也在使用react钩子表单。我的提交方法在我的测试中调用失败。当此测试运行时,我会遇到以下错误:
● reset password should send
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0有人能解释一下我做错了什么吗?
我的组件
const ResetPassword = () => {
const { handleSubmit } = useForm();
const onSubmit = (resetFormData: { email: string }) => {
const { email } = resetFormData;
// sends email using external API
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
name="email"
type="text"
placeholder="Email Address"
/>
<button type="submit">
Send Email
</button>
</form>
);
};
export default ResetPassword;我的测试文件
import userEvent from '@testing-library/user-event';
import { render, cleanup, screen, act } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
afterEach(cleanup);
it('reset password should send', async () => {
render(<ResetPassword />);
const handleSubmit = jest.fn();
const onSubmit = jest.fn();
const value = 'user@email.com';
const input = screen.getByPlaceholderText(/Email Address/i);
await userEvent.type(input, value);
await act(async () => {
userEvent.click(screen.getByRole('button', { name: /Send Email/i }));
});
expect(onSubmit).toHaveBeenCalled();
});发布于 2021-02-01 02:47:06
对于任何在未来偶然发现这一点的人,我阅读了Trixin评论的article,并重写了我的单元测试。下面是它的一个精简版本。基本上,我测试的是用户的体验,而不是开发人员的体验,以避免误报/漏报
组件
const ResetPassword = () => {
const { handleSubmit } = useForm();
const [message, setMessage] = useState(''); // I alert the
// user of a successful sent message
const onSubmit = (resetFormData: { email: string }) => {
const { email } = resetFormData;
// sends email using external API
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
name="email"
type="text"
placeholder="Email Address"
/>
<button type="submit">
Send Email
</button>
{message}
</form>
);
};
export default ResetPassword;测试文件
it('reset password should send', async () => {
render(<ResetPassword />);
const value = 'user@test.com';
const input = screen.getByPlaceholderText(/Email Address/i);
await userEvent.type(input, value);
await act(async () => {
fireEvent.click(screen.getByText(/Send Email/i));
});
expect(screen.getByText('Message Sent!')).toBeInTheDocument();
});
it('reset password should not send', async () => {
render(<ResetPassword />);
const input = screen.getByPlaceholderText(/Email Address/i);
const inValidEmail = 'user.com';
await userEvent.type(input, inValidEmail);
await act(async () => {
fireEvent.click(screen.getByText(/Send Email/i));
});
expect(screen.getByText('Invalid email address')).toBeInTheDocument();
// reset input value
fireEvent.change(input, { target: { value: '' } });
await userEvent.type(input, '');
// user hits spacebar and tries to submit
await act(async () => {
fireEvent.keyDown(input, {
charCode: 62,
code: 62,
key: 'Space Bar',
keyCode: 62,
});
});
await act(async () => {
fireEvent.click(screen.getByText(/Send Email/i));
});
expect(screen.getByText('Email is required')).toBeInTheDocument();
});https://stackoverflow.com/questions/65980481
复制相似问题