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

Jest测试Firebase时Storage模拟报错,正确模拟Firebase Storage的方法是什么?

问题解决方法

错误原因

你遇到的INTERNAL ASSERTION FAILED: Expected a class definition报错由以下几个问题导致:

  • 方法名拼写错误:你模拟的getDownloadUrl大小写不符合Firebase官方API定义,正确方法名是getDownloadURL(URL全大写),拼写不匹配会触发SDK内部断言校验失败。
  • 模拟结构不匹配:如果你使用的是Firebase v9+模块化版本,你没有模拟firebase/storage导出的getStorage方法,导致SDK初始化Storage时无法拿到合法的实例结构,触发类定义校验失败。
  • 模拟逻辑冲突:你同时在initializeApp返回值中定义了storage方法,又单独mock了firebase/storage模块,二者逻辑不匹配,导致SDK内部上下文校验失败。

正确模拟代码

Firebase v9+ 模块化版本

// 预先定义测试用mock数据
const mockUser = { uid: 'test-uid', email: 'test@example.com' };
const mockStorageRef = { fullPath: 'test/file.jpg' };

// mock firebase/app 核心模块
jest.mock('firebase/app', () => ({
  initializeApp: jest.fn(() => ({}))
}));

// mock firebase/auth 模块
jest.mock('firebase/auth', () => ({
  getAuth: jest.fn(() => ({
    currentUser: mockUser
  }))
}));

// mock firebase/storage 模块
jest.mock('firebase/storage', () => ({
  getStorage: jest.fn(() => ({})),
  ref: jest.fn(() => mockStorageRef),
  getDownloadURL: jest.fn(() => Promise.resolve('https://test-domain.com/test-file.jpg'))
}));

如果你用到其他Storage相关方法(比如uploadBytes、deleteObject等),可以直接在firebase/storage的mock导出中添加对应方法即可。

Firebase v8 及以下命名空间版本

如果是v8版本不需要单独mock子模块,直接统一mockfirebase/app即可:

const mockUser = { uid: 'test-uid', email: 'test@example.com' };
const mockStorageRef = { fullPath: 'test/file.jpg' };

jest.mock('firebase/app', () => ({
  initializeApp: jest.fn(() => ({
    auth: jest.fn(() => ({
      currentUser: mockUser
    })),
    storage: jest.fn(() => ({
      ref: jest.fn(() => mockStorageRef),
      getDownloadURL: jest.fn(() => Promise.resolve('https://test-domain.com/test-file.jpg'))
    }))
  }))
}));

验证方法

运行测试前可以先打印调用的Storage相关方法的返回值,确认结构和你mock的逻辑一致,避免拼写或者结构不匹配的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:45:05