jest.mock()传入有效模块名返回undefined问题排查求助
问题原因与解决方案
核心问题1:mock未适配默认导入规则
你使用import validator from 'validator'的默认导入语法引入CommonJS规范的validator模块,而你写的jest.mock工厂函数直接返回了包含isEmail的对象,没有适配ES模块默认导入的格式,导致导入的validator变量取值为undefined。
修改mock写法如下:
jest.mock('validator', () => ({ __esModule: true, default: { isEmail: () => true } }));
添加__esModule: true标记该mock为ES模块,同时把mock的方法放到default属性下,匹配默认导入的取值逻辑。
核心问题2:roots配置错误
你把node_modules加入了jest配置的roots数组,该配置项的作用是指定Jest扫描测试文件的根目录,不需要包含依赖目录,该配置会导致Jest模块解析优先级异常,优先加载node_modules下的真实模块,忽略你定义的mock规则。
修改jest.config.js的roots配置:
roots: ['<rootDir>/src'],
可选验证项
确认你的tsconfig.json中开启了esModuleInterop: true,该配置是TypeScript与CommonJS模块做默认导入交互的必要配置,未开启也可能导致导入模块取值异常。
内容的提问来源于stack exchange,提问作者Eliabe França
相关产品推荐
相关产品推荐

