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

如何在Jest中为firebase.auth()添加Auth属性以实现Mock?

解决Jest Mock Firebase Auth时firebase.auth.Auth未定义的问题

我明白你遇到的困扰了——当你尝试mock Firebase Auth时,firebase.auth.Auth这个静态属性总是找不到,之前把Auth挂在实例上的写法自然行不通,因为**firebase.auth.Auth是属于auth函数本身的静态属性,不是它返回的实例的属性**。

下面给你两种可行的Mock方案,都能完美解决这个问题:

方案一:直接给mock的auth函数添加静态属性

这种方式简单直接,适合快速mock:

jest.mock('firebase/app', () => {
  // 先定义mock的auth函数,它返回带有实例方法的对象
  const mockAuthFn = jest.fn(() => ({
    setPersistence: jest.fn().mockResolvedValue(Promise.resolve()),
    // 这里可以添加其他你需要mock的Auth实例方法,比如signInWithEmailAndPassword等
  }));

  // 关键!给auth函数本身添加Auth静态属性
  mockAuthFn.Auth = {
    Persistence: {
      LOCAL: 'LOCAL',
      SESSION: 'SESSION',
      NONE: 'NONE'
    }
  };

  return {
    auth: mockAuthFn
  };
});

方案二:用Class模拟Firebase Auth的结构

如果需要更贴近真实Firebase Auth的类结构,可以用Class来写,这样静态属性和实例方法的划分更清晰:

jest.mock('firebase/app', () => {
  // 模拟Auth类,包含实例方法和静态属性
  class MockAuth {
    // 实例方法:setPersistence,返回一个resolved的Promise
    setPersistence = jest.fn().mockResolvedValue();

    // 静态属性:Persistence枚举
    static Persistence = {
      LOCAL: 'LOCAL',
      SESSION: 'SESSION',
      NONE: 'NONE'
    };
  }

  // 模拟firebase.auth()调用,返回MockAuth的实例
  const auth = jest.fn(() => new MockAuth());
  
  // 将MockAuth赋值给auth函数的Auth属性,这样firebase.auth.Auth就能访问到
  auth.Auth = MockAuth;

  return {
    auth: auth
  };
});

测试验证示例

写完Mock后,你可以用下面的测试用例验证是否生效:

test('should call setPersistence with LOCAL persistence', async () => {
  const authInstance = firebase.auth();
  await authInstance.setPersistence(firebase.auth.Auth.Persistence.LOCAL);

  // 验证setPersistence被调用,且参数正确
  expect(authInstance.setPersistence).toHaveBeenCalledWith('LOCAL');
  // 验证静态属性能正常访问
  expect(firebase.auth.Auth.Persistence.LOCAL).toBe('LOCAL');
});

为什么之前的写法不生效?

你之前把Auth挂在了构造函数的this上,这意味着它是实例属性,只能通过firebase.auth().Auth访问,但实际场景中我们是通过firebase.auth.Auth(直接访问auth函数的属性)来获取的,所以自然会报错未定义。

内容的提问来源于stack exchange,提问作者Wooble

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:57:28