运行React Native测试套件时找不到metro-react-native-babel-preset预设
解决 "Couldn't find preset 'module:metro-react-native-babel-preset'" 测试错误
这个问题本质是ts-jest和React Native Jest预设的Babel配置冲突导致的——你在ts-jest里开启了useBabelrc: true,但module:metro-react-native-babel-preset是Metro打包器专属的预设路径写法,Jest依赖的旧版Babel核心无法识别这种特殊路径。下面给你三个针对性的解决思路:
方案1:让ts-jest跳过自定义Babelrc,直接使用RN预设
修改你package.json里的Jest配置,把ts-jest的useBabelrc设为false,并指定react-native作为测试用的Babel预设:
"jest": { "preset": "react-native", "moduleFileExtensions": [ "ts", "tsx", "js", "jsx", "json" ], "transform": { "^.+\\.(js)$": "<rootDir>/node_modules/react-native/jest/preprocessor.js", "\\.(ts|tsx)?$": "ts-jest" }, "testRegex": "/src/.*\\.spec\\.(js|ts|tsx)?$", "globals": { "ts-jest": { "useBabelrc": false, "babelConfig": { "presets": ["react-native"] } } } }
这样ts-jest就会忽略你的.babelrc,直接用React Native官方适配Jest的预设,避免路径识别问题。
方案2:给Babelrc添加测试环境专属配置(保留自定义插件)
如果你需要保留.babelrc里的module-resolver等插件,可以给Babel添加环境判断,让测试时自动切换为Jest能识别的预设:
修改你的.babelrc:
{ "presets": ["module:metro-react-native-babel-preset"], "plugins": [ [ "module-resolver", { "alias": { "~": "./src" } } ] ], "env": { "test": { "presets": ["react-native"] } } }
同时保持package.json里ts-jest的useBabelrc: true不变——测试时Babel会自动加载test环境的配置,用react-native预设替代Metro的特殊路径预设。
方案3:确保依赖完整(兜底检查)
虽然大概率不是这个原因,但可以确认一下metro-react-native-babel-preset是否已安装:
# npm npm install metro-react-native-babel-preset --save-dev # yarn yarn add metro-react-native-babel-preset --dev
不过如果你的RN项目开发环境能正常运行,这个依赖应该已经存在,主要还是前两个方案能解决问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

