使用Jest mock fs模块动态导入控制器时遇existsSync导出错误
问题原因及解决方案
核心原因
Node.js的fs模块是CommonJS格式,当在ESM模块中使用import { existsSync } from 'fs'这类命名导入时,Node.js会自动把CommonJS模块的导出成员映射为ESM的顶层命名导出。
但你当前的mock仅将existsSync放在了default对象里,没有把它作为mock模块的顶层导出。当my.controller.js中使用了fs的命名导入时,Jest提供的mock模块找不到对应的顶层导出,就会抛出SyntaxError: The requested module 'fs' does not provide an export named 'existsSync'错误。
修复方案
调整mock的结构,同时提供顶层命名导出和默认导出,兼容两种导入方式:
jest.unstable_mockModule('fs', () => { const mockFs = { readFileSync: () => CONTENT_DATA, existsSync: () => {}, }; // 同时导出顶层成员和default对象 return { ...mockFs, default: mockFs, }; });
如果你的业务代码只使用默认导入(import fs from 'fs'),那需要检查my.controller.js是否误用了命名导入,调整代码或mock结构均可解决问题。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

