jest 手动模拟需将 mock 文件置于 mocks 目录且路径严格匹配被模拟模块,第三方包仅支持顶层名称(如 axios),启用时须显式调用 jest.mock(),并注意调用时机、模块缓存及 esm/ts 导出规范。

在 Jest 中使用 manual mocks(手动模拟)组织模拟文件,核心是遵循 Jest 的自动 mock 解析规则,把模拟文件放在 __mocks__ 目录下,并确保路径与被模拟模块严格对应。
手动模拟文件的存放位置和命名规则
Jest 会自动查找与目标模块同名、且位于其父目录下 __mocks__ 子目录中的文件。路径必须完全匹配,大小写敏感。
- 若要 mock
src/utils/api.js,就在src/utils/__mocks__/api.js中编写模拟实现 - 若要 mock
node_modules/axios,就在项目根目录下的__mocks__/axios.js(注意:不是node_modules/__mocks__/) - 第三方包的 mock 不支持子路径,例如不能 mock
lodash/debounce,只能 mock 整个lodash
在测试中启用 manual mock
手动模拟不会自动生效,需显式调用 jest.mock()(即使无 factory 参数)来激活。
-
jest.mock('../utils/api');—— 相对路径,Jest 会去同级__mocks__找 -
jest.mock('axios');—— 模块名,Jest 会去根目录__mocks__找 - 推荐在测试文件顶部统一调用,避免遗漏;也可放在
setupFilesAfterEnv中全局启用(慎用,易污染)
编写可复用、可配置的 mock 实现
不要只写固定返回值。利用 jest.fn() 和模块导出逻辑提升灵活性。
- 在
__mocks__/api.js中导出一个工厂函数,接收 mock 行为配置 - 主模块导出对象时,mock 文件也导出结构一致的对象,方法用
jest.fn()替代 - 示例:
// __mocks__/api.js<br>const mockApi = {<br> fetchUser: jest.fn(),<br> createPost: jest.fn(),<br>};<br>export default mockApi;
测试中可提前设定:mockApi.fetchUser.mockResolvedValue({ id: 1, name: 'Alice' });
注意模块解析优先级和常见陷阱
Jest 的 mock 解析有明确优先级,容易因路径或调用时机出错。
-
jest.mock()必须在模块被import之前调用(ES 模块静态解析限制),否则 mock 不生效 - 如果模块已被缓存(如其他测试已导入),需加
{ virtual: true }或用jest.resetModules()清理 - ESM 项目中,
__mocks__文件必须有明确导出(export default或export const xxx),不能只写module.exports - 使用 TypeScript 时,mock 文件建议加
.ts后缀,并在tsconfig.json中包含__mocks__
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











