Expo 49升级后Jest测试报错:getReactNativePersistence不是函数
解决Expo 49升级后Jest测试中Firebase
getReactNativePersistence 报错问题 问题原因
Jest测试环境并非真实React Native运行环境,Firebase的React Native专用持久化方法getReactNativePersistence不会被正确加载,导致方法未定义触发报错。
解决方案
方案1:Mock Firebase Auth模块
在Jest配置文件(如jest.config.js)或测试文件顶部添加Mock逻辑:
jest.mock('firebase/auth', () => { const originalModule = jest.requireActual('firebase/auth'); return { ...originalModule, getReactNativePersistence: jest.fn(() => jest.fn()), initializeAuth: jest.fn(() => ({ // 按需添加Auth对象的模拟方法,比如signInWithEmailAndPassword等 signInWithEmailAndPassword: jest.fn(), currentUser: null, })), }; });
方案2:区分环境初始化Firebase
修改Firebase初始化代码,测试环境下不使用React Native持久化:
import AsyncStorage from "@react-native-async-storage/async-storage"; import { initializeApp } from "firebase/app"; import { initializeAuth, getReactNativePersistence, browserLocalPersistence } from "firebase/auth"; import { getFirestore } from "firebase/firestore"; import { getStorage } from "firebase/storage"; const firebaseConfig = {...}; const app = initializeApp(firebaseConfig); let auth; if (process.env.NODE_ENV === 'test') { // 测试环境使用浏览器持久化或默认内存持久化 auth = initializeAuth(app, { persistence: browserLocalPersistence, }); } else { auth = initializeAuth(app, { persistence: getReactNativePersistence(AsyncStorage), }); } const db = getFirestore(app); const storage = getStorage(app); export { auth, db, storage };
注:Expo的Jest默认会自动将process.env.NODE_ENV设置为test,无需额外配置。
方案3:简化Mock AsyncStorage和持久化方法
如果只需要基础Mock,在测试文件中添加:
import '@react-native-async-storage/async-storage/jest/async-storage-mock'; jest.mock('firebase/auth', () => ({ ...jest.requireActual('firebase/auth'), getReactNativePersistence: () => jest.fn(), }));
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

