jest 模拟模块的核心是 jest.mock(),支持自动模拟(生成空壳)、手动模拟(__mocks__/ 自定义)和内联模拟(工厂函数);需在 import 前调用,配合 jest.requireactual() 和 jest.resetmodules() 实现精准控制与还原。

Jest 提供了多种方式来模拟外部模块,核心是通过 jest.mock() 实现自动或手动的模块替换,关键在于调用时机、模拟策略和还原控制。
自动模拟(Auto-mocking)
对未显式定义模拟行为的模块,Jest 默认会自动创建一个“空壳”模拟:所有导出函数变成 mock 函数(返回 undefined),对象属性变成 undefined,ESM 默认导出也变为 mock 函数。
只需在测试文件顶部调用:
jest.mock('axios'); // 自动模拟 axios 模块
之后导入并使用时,实际调用的是 Jest 生成的 mock 版本:
import axios from 'axios';
test('calls axios.get', () => {
axios.get('https://api.example.com');
expect(axios.get).toHaveBeenCalledWith('https://api.example.com');
});
手动模拟(Manual Mocks)
当需要自定义返回值、行为或结构时,可在项目中创建手动 mock 文件。Jest 会优先使用 __mocks__/ 目录下的同名文件。
- 在
src/__mocks__/axios.js中写:
const mockAxios = {
get: jest.fn(),
post: jest.fn()
};
// 模拟成功响应
mockAxios.get.mockResolvedValue({ data: { id: 1, name: 'test' } });
export default mockAxios;
再在测试中调用 jest.mock('axios') 即可加载该手动 mock。
内联模拟(Inline Mocks)
适合临时、轻量级的模拟,直接在测试中用工厂函数定义行为:
jest.mock('fs', () => ({
readFileSync: jest.fn().mockReturnValue('mock file content'),
writeFileSync: jest.fn()
}));
import { readFileSync } from 'fs';
test('reads file', () => {
expect(readFileSync('test.txt')).toBe('mock file content');
});
注意:必须在 import 语句之前调用 jest.mock(),否则模块已被真实加载,mock 失效。
模拟特定导出 & 还原控制
使用 jest.requireActual() 可保留部分真实逻辑;用 jest.resetModules() 或 jest.unmock() 可清理 mock 状态:
- 只 mock 某个函数,其余用真实实现:
jest.mock('lodash', () => {
const original = jest.requireActual('lodash');
return {
...original,
debounce: jest.fn() // 只替换 debounce
};
});
- 每个测试后重置模块缓存(避免 mock 泄漏):
beforeEach(() => {
jest.resetModules();
});
test('uses fresh mock', () => {
jest.mock('./utils', () => ({ helper: jest.fn() }));
const { helper } = require('./utils');
helper();
expect(helper).toHaveBeenCalledTimes(1);
});
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











