求助:Jest 27中__mocks__文件夹在TypeScript下无法正常工作
解决Jest用__mocks__文件夹mock AWS SDK失败的问题
问题根源
- Mock文件路径错误:你要mock的模块是
@aws-sdk/client-sfn,对应的mock文件需放在root/__mocks__/@aws-sdk/client-sfn.ts,而非当前的client-sfn/client-sfn.ts,Jest无法识别非标准路径的mock文件。 - Mock内容不完整:当前mock文件仅导出两个mock函数,未保留原模块的其他导出。这会导致要么依赖原模块其他内容的代码报错,要么Jest未正确将原函数替换为mock,最终断言时拿到的不是
jest.fn()创建的mock函数。
解决步骤
1. 修正Mock文件的路径和内容
将mock文件移动到正确位置,并保留原模块所有导出,仅替换需要mock的部分,和你之前用jest.mock写的逻辑保持一致:
创建root/__mocks__/@aws-sdk/client-sfn.ts,内容如下:
// 加载原模块的真实导出内容 const actualClientSfn = jest.requireActual('@aws-sdk/client-sfn'); // 导出原模块所有内容,同时覆盖需要mock的两个命令 export { ...actualClientSfn }; export const SendTaskSuccessCommand = jest.fn(); export const SendTaskFailureCommand = jest.fn();
2. 在测试文件中启用mock
在需要使用该mock的测试文件顶部添加:
jest.mock('@aws-sdk/client-sfn');
如果所有测试都需要用到这个mock,也可以在jest.config.js的setupFilesAfterEnv中统一配置,无需每个测试文件重复编写。
3. 验证导入方式
确保测试文件中从正确的模块路径导入目标函数:
import { SendTaskSuccessCommand } from '@aws-sdk/client-sfn';
4. 调整Jest配置(可选)
如果项目子目录存在独立的package.json,需确保Jest能找到根目录的__mocks__文件夹,可在jest.config.js中添加:
module.exports = { modulePaths: ['<rootDir>'], // 其他配置项... };
测试验证
重新运行测试,此时SendTaskSuccessCommand会是Jest生成的mock函数,toHaveBeenCalledWith断言即可正常执行。
内容的提问来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

