You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:28:17