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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:38