react-hook-form submit 没有从 jest 测试中获取 changeText
Posted
技术标签:
【中文标题】react-hook-form submit 没有从 jest 测试中获取 changeText【英文标题】:react-hook-form submit does not pick up changeText from jest test 【发布时间】:2021-02-25 03:59:50 【问题描述】:我有以下react-native-form
:
const register, handleSubmit, setValue, errors = useForm();
const onSubmit = (data) =>
console.log(data);
return firebase
.auth()
.signInWithEmailAndPassword(data.email, data.password)
.then((info) =>
console.log(info.additionalUserInfo.profile);
)
.catch((err) =>
console.error(err);
);
;
<View>
<TextInput
placeholder="Email"
testID="email-input"
onChangeText=(t) => setValue("email", t)
style=styles.loginTextInput
></TextInput>
<TextInput
secureTextEntry=true
testID="password-input"
placeholder="Password (min. 8 characters)"
onChangeText=(t) => setValue("password", t)
style=styles.loginTextInput
></TextInput>
<TouchableOpacity
onPress=handleSubmit(onSubmit)
testID="login-email-button"
style=[styles.loginButton, styles.loginEmailButton]
>
<Text style=styles.buttonText>Login with Email</Text>
</TouchableOpacity>
</View>
我正在以下测试中使用jest
测试提交和对firebase.auth().signInWithEmailAndPassword
的调用:
test("submit works", async () =>
const getByPlaceholderText, getByTestId, getByText = render(
<EmailLogin />
);
const emailInput = getByTestId("email-input");
const passwordInput = getByTestId("password-input");
const submitButton = getByTestId("login-email-button");
const email = "foo@email.com";
const password = "password";
fireEvent.changeText(emailInput, email);
fireEvent.changeText(passwordInput, password);
fireEvent.press(submitButton);
expect(firebase.auth().signInWithEmailAndPassword).toHaveBeenCalledWith(
email,
password
);
);
我将signInWithEmailAndPassword
模拟为jest.fn()
。
当我运行这个测试时,它失败了:
expect(jest.fn()).toHaveBeenCalledWith(...expected)
Expected: "foo@email.com", "password"
Received: undefined, undefined
我注意到我的onSubmit
函数中的console.log(data)
打印出来了:
console.log
这意味着没有文本被拾取。
我该如何测试这个表单?
【问题讨论】:
你也在用酶吗?有了它会轻松很多 你能展示一下你是如何嘲笑firebase
的吗?
【参考方案1】:
我认为它为您返回 undefined 的原因是您正在尝试以同步方式测试异步行为。我建议在您的onSubmit
方法中使用Promises
来等待firebase auth
调用完成。
这样的东西可以工作
const onSubmit = async (data) =>
console.log(data);
return await firebase
.auth()
.signInWithEmailAndPassword(data.email, data.password)
.then((info) =>
console.log(info.additionalUserInfo.profile);
)
.catch((err) =>
console.error(err);
);
;
这将确保您正在等待登录。
在你的测试中,我会将 firebase 模拟成这样
jest.mock('firebase', () => (
auth: jest.fn().mockReturnThis(),
signInWithEmailAndPassword: jest.fn(),
)
);
然后在您的测试中,您还需要使用waitFor()
等待登录发生,然后您可以检查您的结果。像这样的东西可以工作
await waitFor(() => expect(firebase.auth().signInWithEmailAndPassword).toHaveBeenCalledWith(
email,
password
););
我自己没有测试过,但尝试使用 async 和 Promises 的想法,如果可行,请告诉我。
【讨论】:
以上是关于react-hook-form submit 没有从 jest 测试中获取 changeText的主要内容,如果未能解决你的问题,请参考以下文章
结合 react-hook-form 从 MUI 更新 TextField。 onChange 没有被调用
使用 reactstrap 从 react-hook-form 访问错误
可以将 reactstrap 与 react-hook-form 和 react-input-mask 一起使用吗?
如果输入在材料 ui 对话框中,react-hook-form 的 setValue 方法不起作用
使用带有 Material-UI 自动完成功能的 react-hook-form 控制器的正确方法
使用 React-Hook-Form 和 YupResolver 时遇到此错误:尝试导入错误:“set”未从“react-hook-form”导出(导入为“o”)