React Native中Jest模拟Firebase Auth函数测试失败求助
解决React Native中Firebase Auth注册函数测试未捕获调用的问题
你的测试失败的核心问题是没有正确Mock Firebase Auth模块,导致无法追踪createUserWithEmailAndPassword的调用情况。动态require的方式无法关联到组件实际调用的函数实例,所以断言永远会显示调用次数为0。以下是修复步骤:
1. 提前Mock @react-native-firebase/auth模块
在测试文件顶部,使用Jest的jest.mock来完整Mock Firebase Auth模块,确保组件和测试使用的是同一个mock函数实例:
// 测试文件顶部添加Mock代码 jest.mock('@react-native-firebase/auth', () => ({ auth: jest.fn(() => ({ createUserWithEmailAndPassword: jest.fn(), })), })); // 导入mock后的auth模块(方便后续引用) import auth from '@react-native-firebase/auth';
2. 修改测试用例逻辑
移除测试中动态require的代码,直接引用mock好的函数进行断言,同时简化异步等待逻辑:
it("should call createUserWithEmailAndPassword when the sign-up button is pressed", async () => { const { getByTestId } = renderComponent(); // 填充输入框内容 const emailInput = getByTestId("email-input"); const passwordInput = getByTestId("password-input"); const confirmPasswordInput = getByTestId("confirm-input"); fireEvent.changeText(emailInput, "test@example.com"); fireEvent.changeText(passwordInput, "password123"); fireEvent.changeText(confirmPasswordInput, "password123"); // 触发注册按钮点击 const signUpButton = getByTestId("signup-button"); fireEvent.press(signUpButton); // 获取mock的注册函数实例 const mockCreateUser = auth().createUserWithEmailAndPassword; // 断言函数调用情况 await waitFor(() => { expect(mockCreateUser).toHaveBeenCalledTimes(1); expect(mockCreateUser).toHaveBeenCalledWith( "test@example.com", "password123" ); }); });
关键修复点说明
- 统一Mock实例:通过
jest.mock在测试启动时替换Firebase Auth模块,组件和测试共享同一个mock函数,才能正确捕获调用记录。 - 取消动态require:测试中动态
require会生成全新的模块实例,和组件调用的不是同一个,自然无法追踪调用行为。 - 简化元素获取:若按钮是初始渲染就存在的,无需用
waitFor包裹;如果是条件渲染的按钮,再保留waitFor获取逻辑。
额外检查项
- 确认组件中注册逻辑正确调用了
auth().createUserWithEmailAndPassword,没有拼写错误(比如你测试注释里的signupWithEmailAndPassword和实际函数名是否一致)。 - 检查注册按钮的点击事件是否真的触发了注册逻辑,没有因为密码校验失败、输入格式错误等逻辑提前返回。
内容的提问来源于stack exchange,提问作者Sam Dopps
相关产品推荐
相关产品推荐

