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

Jest如何mock对象内部函数:解决Firebase getAuth mock时currentUser未定义报错

问题解决说明

错误原因

你犯了两个核心错误:

  • getAuth() 是同步返回Auth对象的普通函数,不是异步函数,你用mockResolvedValueOnce会让它返回Promise对象,而Promise上没有currentUser属性,自然会报Cannot read property 'currentUser' of undefined
  • getIdToken() 官方返回类型是Promise<string>,你mock返回普通字符串'abc'不符合类型定义,后续拼接请求头时也会出现[object Promise]的异常值
  • 额外补充:你原业务代码里调用getIdToken()没有加await,拿到的是Promise对象而非token字符串,业务逻辑本身也有问题,需要先补上await

正确mock写法

步骤1:头部mock保持不变

jest.mock("firebase/auth", () => {
  return {
    getAuth: jest.fn()
  }
})

步骤2:测试用例内正确mock返回值

it("should login success and setUser", async () => {
  // 同步函数用mockReturnValue,不要用mockResolvedValue
  (getAuth as jest.Mock).mockReturnValueOnce({
    currentUser: {
      // getIdToken是异步方法,返回Promise包裹的token
      getIdToken: jest.fn().mockResolvedValueOnce('abc')
    }
  })

  // 调用你的业务方法
  const result = await getUserFromDb();
  // 后续断言逻辑
})

步骤3:修正原业务代码的遗漏await问题

export const getUserFromDb = async () => {
  const path = "/user";
  // 这里必须加await,不然拿到的是Promise不是token字符串
  const firebaseToken = await getAuth().currentUser?.getIdToken(); 
  
  console.log(firebaseToken)
  const myInit = {
    headers: {
      Authorization: `token ${firebaseToken}`,
    },
  };

  return API.get(path, myInit);
};

额外适配场景:currentUser为空的情况

如果要测试用户未登录的场景,只需要把currentUser设为null即可:

(getAuth as jest.Mock).mockReturnValueOnce({
  currentUser: null
})

此时getIdToken()不会执行,firebaseToken值为undefined,符合可选链的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:09:03