gpt4 book ai didi

jestjs - react-hook-form submit 不从 jest 测试中获取 changeText

转载 作者:行者123 更新时间:2023-12-03 17:10:16 24 4
gpt4 key购买 nike

我有以下 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>
我正在测试提交和调用 firebase.auth().signInWithEmailAndPassword使用 jest在以下测试中:
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
);
});
我 mock 的地方 signInWithEmailAndPassword作为 jest.fn() .
当我运行这个测试时,它失败了:
expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected: "foo@email.com", "password"
Received: undefined, undefined
我注意到 console.log(data)我在我的 onSubmit函数打印出来:
console.log
{}
这意味着没有选择文本。
我该如何测试这个表格?

最佳答案

我认为它为您返回 undefined 的原因是您试图以同步方式测试异步行为。我建议使用 Promises在您的 onSubmit等待 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 的想法,让我知道它是否有效。

关于jestjs - react-hook-form submit 不从 jest 测试中获取 changeText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64815918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com