【发布时间】:2021-10-18 05:39:26
【问题描述】:
我正在使用 jest 和测试库来测试表单。但是没有调用模拟函数。最后一行expect(mockOnSubmit).toHaveBeenCalled(); 总是失败。
这是我的测试代码:
App.test.js
import { render, fireEvent, cleanup } from "@testing-library/react";
import App from "./App";
import { act } from "react-dom/test-utils";
afterEach(cleanup);
test("email and password field are clear for submit", async () => {
const mockOnSubmit = jest.fn();
const { getByPlaceholderText, getByText } = render(
<App onSubmit={mockOnSubmit} />
);
const emailNode = getByPlaceholderText(/email/i);
const passwordNode = getByPlaceholderText(/password/i);
const testEmail = "test@example.com";
const testPassword = "123123";
await act(async () => {
fireEvent.change(emailNode, {
target: { value: testEmail }
});
fireEvent.change(passwordNode, {
target: { value: testPassword }
});
});
expect(emailNode.value).toBe(testEmail);
expect(passwordNode.value).toBe(testPassword);
const submit = getByText(/submit/i);
await act(async () => {
fireEvent.click(submit);
});
expect(mockOnSubmit).toHaveBeenCalled();
});
App.js
import { useForm } from "react-hook-form";
import { Controller } from "react-hook-form";
export default function App({ onSubmit = (data) => console.log(data) }) {
const { control, handleSubmit } = useForm();
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Controller
name="email"
control={control}
defaultValue=""
rules={{
required: `Email is required.`,
pattern: {
value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i,
message: "Invalid email address"
}
}}
render={({ field }) => {
return (
<input
placeholder="Email"
type="text"
key="email"
name="email"
id="email"
{...field}
/>
);
}}
/>
<Controller
name="email"
control={control}
defaultValue=""
rules={{
required: `Password is required.`
}}
render={({ field }) => {
return (
<input
placeholder="Password"
type="text"
key="password"
name="password"
id="password"
{...field}
/>
);
}}
/>
<input type="submit" value="submit" />
</form>
);
}
这个最小的实现也可以在 https://codesandbox.io/s/react-hook-form-testing-olo4i
旁注:没有react-hook-form 实现也可以正常工作。但是当我从react-hook-form 添加handleSubmit 时,它不再起作用了。这是@Florian Motteau 的working version,它通过绕过react-hook-form 来工作
【问题讨论】:
-
请在问题中输入minimal reproducible example -
App是否真的处理onSubmit属性? -
@jonrsharpe 出现在问题末尾的代码沙箱链接中。
-
是的,但这不是问题。请注意How to Ask 中的指导。
-
正如@jonrsharpe 所说,请将相关组件添加到问题中。但是顺便说一句,我认为问题在于控制器,要签出,使用简单的输入元素更改受控的“电子邮件”和“密码”组件,并尝试从“react-hook-forms”传递“注册”方法
-
感谢您的建议,我添加了最小的可重现示例
标签: javascript reactjs jestjs react-testing-library react-hook-form