使用Jest测试capitalize函数时触发TypeError:该函数不是函数
解决Jest测试中
TypeError: (0 , _capitalize.default) is not a function错误 问题根源
你遇到的错误来自两个核心问题:
- 导出与导入方式不匹配:你的
capitalize.js使用命名导出,但测试文件里用了默认导入,导致导入的capitalize为undefined,调用时报错。 - Jest对ESM模块的支持配置缺失:项目在
package.json中设置了"type": "module"启用ES模块,但Jest默认使用CommonJS模块系统,需额外配置才能兼容。
解决步骤
步骤1:修复导出导入不匹配问题
两种可选方案,选其一即可:
方案A:将函数改为默认导出
修改js/scripts/capitalize.js的导出语句:
const firstChar = str => Array.from(str)[0]; const capitalize = str => firstChar(str).toUpperCase() + str.slice(1); // 改为默认导出 export default capitalize;
方案B:测试文件使用命名导入
修改js/tests/capitalize.test.js的导入语句:
// 改为命名导入,对应原文件的命名导出 import { capitalize } from '../scripts/capitalize'; it('should capitalize first letter', () => { expect(capitalize('foo')).toBe('Foo'); }); it('should capitalize first letter', () => { expect(capitalize('egg')).toBe('Egg'); });
步骤2:配置Jest支持ES模块
因为项目启用了ESM,需要让Jest正确处理这类模块:
- 在项目根目录创建
babel.config.json文件,内容如下:
{ "presets": [["@babel/preset-env", { "targets": { "node": "current" } }]] }
该配置会让Babel将ES模块转译为Jest可识别的格式。
- (可选)若上述配置仍有问题,修改
package.json中的test脚本,添加Node.js处理ESM的实验性标志:
"scripts": { "test": "NODE_OPTIONS=--experimental-vm-modules jest" }
验证修复
完成配置后,重新运行测试命令:
npm test -- capitalize.test.js
此时测试应能正常通过。
内容的提问来源于stack exchange,提问作者JackJack
相关产品推荐
相关产品推荐

