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

