升级Jest与React Native后LogBox模拟失效致测试报错求助
TypeError: Cannot read properties of undefined (reading 'ignoreLogs') after upgrading React Native 0.70 + Jest 29/expo-jest 49
问题重现
升级React Native到0.70、Jest到29(或expo-jest到49)后,测试套件执行失败,报错如下:
Test suite failed to run TypeError: Cannot read properties of undefined (reading 'ignoreLogs') 33 | // https://reactnavigation.org/docs/troubleshooting/#i-get-the-warning-non-serializable-values-were-found-in-the-navigation-state 34 | > 35 | LogBox.ignoreLogs([ | ^ 36 | 'Non-serializable values were found in the navigation state', 37 | ]); 38 |
已尝试在配置文件和单个测试中模拟LogBox,但问题仍存在,模拟代码如下:
jest.mock('react-native/Libraries/LogBox/LogBox', () => ({ ignoreLogs: jest.fn(), ignoreAllLogs: jest.fn(), }));
该问题在Jest 26.x版本中未出现。
解决方案
1. 匹配LogBox实际导入路径调整Mock
如果你的代码中是从react-native根模块导入LogBox(import { LogBox } from 'react-native'),而非深层路径,之前的Mock路径会不匹配,导致LogBox未被正确模拟。
修改Mock代码为:
jest.mock('react-native', () => ({ // 保留react-native其他原有模块的实现 ...jest.requireActual('react-native'), LogBox: { ignoreLogs: jest.fn(), ignoreAllLogs: jest.fn(), }, }));
2. 确保Mock在测试执行前加载
将Mock代码放在Jest全局配置文件中(比如jest.setup.js),并在jest.config.js中配置加载该文件,保证Mock在所有测试文件执行前生效:
- 在项目根目录创建
jest.setup.js,添加上述Mock代码; - 修改
jest.config.js:
module.exports = { // 其他已有配置 setupFilesAfterEnv: ['./jest.setup.js'], };
如果是单个测试文件中使用Mock,需确保Mock语句早于LogBox的导入语句。
3. 检查Expo依赖版本兼容性
如果是Expo项目,确认Expo SDK版本与React Native 0.70匹配(Expo SDK 48对应RN 0.70),同时保证expo-jest版本与SDK版本一致,避免版本不兼容导致的模块解析问题。
4. 临时方案:直接覆盖LogBox方法
如果上述Mock方式仍不生效,可在测试文件开头直接覆盖LogBox的方法:
import { LogBox } from 'react-native'; // 手动替换为jest mock函数 LogBox.ignoreLogs = jest.fn(); LogBox.ignoreAllLogs = jest.fn();
内容的提问来源于stack exchange,提问作者cohs
相关产品推荐
相关产品推荐

