Node.js v18.12.1 ESM环境下Jest模块Mock失败问题求助
Node.js ESM环境下Jest Mock Axios问题解决方案
针对你在Node.js v18.12.1 ESM环境中使用Jest Mock axios遇到的两个错误,以下是具体解决步骤:
1. 修正Jest配置文件
删除原配置中无关的ts-jest设置,替换为ESM适配的配置(jest.config.js):
export default { testEnvironment: 'node', transform: {}, // 将.js文件视为ESM处理 extensionsToTreatAsEsm: ['.js'], // 处理ESM导入的扩展名问题 moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', }, };
2. 调整测试文件代码
ESM环境下Jest的模块Mock逻辑与CommonJS不同,修改user.test.js如下:
import { test, expect, jest } from "@jest/globals"; import Users from './users.js'; // ESM要求导入完整扩展名 // 使用unstable_mockModule对ESM模块进行Mock jest.unstable_mockModule('axios', () => ({ default: { get: jest.fn(), // 显式定义get为Mock函数 }, })); // 动态导入axios,确保获取到Mock后的实例 const axios = (await import('axios')).default; test('should fetch users', async () => { const users = [{name: 'Bob'}]; const resp = {data: users}; axios.get.mockResolvedValue(resp); // 使用async/await替代then,更直观 const data = await Users.all(); expect(data).toEqual(users); // 验证axios.get是否被正确调用 expect(axios.get).toHaveBeenCalledWith('/users.json'); });
3. 优化package.json测试命令
将测试命令简化为:
{ "scripts": { "test": "NODE_OPTIONS=\"--experimental-vm-modules\" jest" } }
完成以上修改后,执行npm test即可正常运行测试,解决之前的require is not defined和mockResolvedValue is not a function错误。
内容的提问来源于stack exchange,提问作者Harshal Khairnar
相关产品推荐
相关产品推荐

