如何解决Jest测试中的TypeError: invoker is not a function错误?
解决Ramda配合Jest测试时
TypeError: invoker is not a function错误 问题分析
错误提示指向Math.floor,但错误栈显示实际问题出在Ramda的join.js模块内的invoker函数,这是Babel转译配置与Ramda模块加载逻辑不兼容导致的,和Math.floor本身无关。
解决方案
1. 调整Babel测试环境的模块配置
Jest运行在Node.js环境,需要CommonJS模块格式。当前babel.config.js中@babel/preset-env的modules: false会保留ES模块语法,导致Ramda内部模块加载异常。修改配置如下:
module.exports = { presets: [ 'module:metro-react-native-babel-preset', '@babel/preset-flow', ], plugins: [], env: { test: { presets: [ '@babel/preset-react', ['@babel/preset-env', { modules: 'commonjs', // 将false改为commonjs }], ], plugins: [ '@babel/plugin-proposal-class-properties', 'ramda', ], }, }, };
2. 确保babel-plugin-ramda与Ramda版本匹配
版本不兼容会导致转译逻辑出错,比如Ramda v0.28.x对应babel-plugin-ramda v2.0.x。重新安装匹配版本:
npm uninstall babel-plugin-ramda npm install babel-plugin-ramda@2.0.0 --save-dev
3. 简化Ramda管道函数写法(可选)
若上述方案无效,可拆分管道函数避免转译冲突:
// 修改src/StringUtil.js中的intStr定义 const intStr = num => R.pipe( Math.abs, R.toString, R.split(''), R.reverse, R.splitEvery(3), R.intersperse(','), R.flatten, R.reverse, R.join('') )(num);
验证修改
重新运行测试命令:
npm test
内容的提问来源于stack exchange,提问作者sato
相关产品推荐
相关产品推荐

