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

升级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在所有测试文件执行前生效:

  1. 在项目根目录创建jest.setup.js,添加上述Mock代码;
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:11:01