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

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

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

这个问题我之前也踩过坑,核心原因是没搞清楚Firebase中auth的结构:它既是一个可以调用生成实例的函数,同时这个函数本身还挂载了静态属性Auth。你之前的mock只处理了auth()返回的实例方法,却忽略了给auth函数本身添加静态属性,导致访问firebase.auth.Auth时找不到定义。

正确的Mock方式

我们需要创建一个模拟的auth函数,既让它能返回带有实例方法(比如setPersistence)的对象,同时给这个函数本身挂载Auth静态属性:

jest.mock('firebase/app', () => {
  // 1. 定义模拟的auth函数,返回auth实例的方法
  const auth = () => ({
    // mock setPersistence方法,返回resolved的Promise
    setPersistence: jest.fn().mockResolvedValue(true),
    // 可以在这里添加其他需要mock的auth实例方法,比如signInWithEmailAndPassword等
  });

  // 2. 给auth函数本身添加静态属性Auth,对应Firebase的Auth类型定义
  auth.Auth = {
    Persistence: {
      LOCAL: 'LOCAL',
      SESSION: 'SESSION',
      NONE: 'NONE'
    }
  };

  // 3. 导出这个配置好的auth函数
  return { auth };
});

为什么之前的构造函数方式没生效?

你之前尝试用构造函数给实例添加this.Auth,但firebase.auth.Auth是挂载在auth函数本身上的静态属性,不是实例的属性。打个比方,Firebase的原生结构大概是这样的:

function auth() {
  // 返回auth实例
  return { setPersistence: ... };
}
// 静态属性挂载在函数上
auth.Auth = { Persistence: ... };

所以你需要直接给auth函数对象添加属性,而不是给它的实例加。

验证Mock是否生效

可以写个简单的测试用例验证:

import firebase from 'firebase/app';

test('Firebase auth persistence mock works correctly', async () => {
  await firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL);
  // 验证setPersistence被正确调用,参数是LOCAL
  expect(firebase.auth().setPersistence).toHaveBeenCalledWith('LOCAL');
});

这样就能解决firebase.auth.Auth未定义的问题,同时正常mocksetPersistence方法了。

内容的提问来源于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 08:02:05