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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:45:34