React Native运行App-test.js测试失败报Native module cannot be null如何解决
错误产生原因
Jest测试默认运行在无原生能力的Node.js环境,不存在React Native端的原生模块实现。你项目中使用的react-native-file-viewer是依赖原生端能力的三方库,它初始化时会实例化NativeEventEmitter绑定对应原生模块,测试环境下原生模块返回null,直接触发Invariant Violation报错。
排查步骤
- 确认报错链路:根据错误栈可以看到,测试运行时加载了
src/screens/CreatePostScreen.js,该文件引入了react-native-file-viewer,触发了库的初始化逻辑 - 检查Jest配置:确认当前没有对
react-native-file-viewer做Mock处理,也没有配置对应的转译忽略规则
修复方案
方案1:Mock原生三方库(最常用)
在项目根目录的__mocks__文件夹下新建react-native-file-viewer.js文件,写入Mock内容,覆盖原有库的逻辑:export default { open: jest.fn(), // 补全所有你项目中用到的该库的API的Mock实现 }如果仅需要针对单个测试文件生效,可以直接在测试文件顶部添加:
jest.mock('react-native-file-viewer', () => ({ open: jest.fn() }))方案2:调整Jest转译规则
检查jest.config.js中的transformIgnorePatterns配置,确保react-native-file-viewer被列入需要转译的包范围:module.exports = { transformIgnorePatterns: [ 'node_modules/(?!(react-native|react-native-file-viewer|其他需要转译的React Native依赖)/)' ] }方案3:业务代码优化(可选)
把react-native-file-viewer的引入逻辑调整为调用时动态引入,避免页面初始化阶段就加载该库,从根源上避免测试环境触发原生库初始化逻辑。
内容的提问来源于stack exchange,提问作者Tasbeel Zahid
相关产品推荐
相关产品推荐

