Jest测试中无法访问Node.js内置fetch函数的问题
Node.js 18内置fetch在Jest中报错“fetch is not defined”的解决方法
问题场景
我有一段使用Node.js 18.x内置全局fetch的函数,无需额外导入模块:
export async function loginNextAuth(displayName, password) { const response = await fetch('/api/auth/callback/credentials') }
这段代码在常规运行和Playwright测试中都能正常工作,但在Jest测试里却抛出ReferenceError: fetch is not defined错误。检查后发现,Jest环境的process.version和开发环境一致为v18.12.1,但global和globalThis对象中都没有fetch属性。
解决方法
1. 升级Jest到29.x及以上版本
Jest 29.x开始默认支持Node.js 18的全局fetch API,直接升级Jest版本就能解决这个问题。
2. 手动在Jest中挂载全局fetch
如果暂时无法升级Jest,可以通过配置文件手动把fetch挂载到全局:
- 创建
jest.setup.js文件:
// 直接使用Node内置的fetch globalThis.fetch = fetch; // 若需要更完整的测试模拟,也可以安装node-fetch包后挂载 // const fetch = require('node-fetch'); // globalThis.fetch = fetch;
- 在
jest.config.js中配置这个setup文件:
module.exports = { // 其他配置项... setupFilesAfterEnv: ['./jest.setup.js'], };
3. 确认Jest环境配置
确保你的Jest配置中使用的是默认的jest-environment-node环境,并且该依赖包版本足够新,能适配Node 18的全局API。如果之前修改过环境配置,改回默认即可。
原因说明
早期版本的Jest(如28及以下)即使运行在Node 18环境中,默认也没有启用对Node内置fetch的支持,需要通过升级或手动配置来让Jest识别这个全局API。
内容的提问来源于stack exchange,提问作者Jakub Koralewski
相关产品推荐
相关产品推荐

