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
相关产品推荐
相关产品推荐

