You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于单个测试用例修改Jest Mock的实现?

在Jest v21中实现单个测试用例修改Mock并自动恢复的方案

针对你在Jest v21里的需求——单个测试用例修改Mock依赖的实现,且下一个测试自动恢复原始Mock,我整理了两种实用的原生方案,不需要额外插件就能搞定:

方案一:全局Mock + 手动保存/恢复原始实现

适合已经用jest.mock()全局Mock整个模块的场景:

1. 先全局Mock依赖

在测试文件最顶部,Mock目标依赖并设置默认实现:

// 全局Mock ./utils模块
jest.mock('./utils', () => ({
  getUser: jest.fn(() => Promise.resolve({ id: 1, name: 'Default Mock User' }))
}));

// 导入Mock后的模块和业务代码
const { getUser } = require('./utils');
const userService = require('./userService');

// 保存原始的Mock实现,用于后续恢复
const originalGetUserImpl = getUser.mockImplementation;

2. 在单个测试中修改Mock实现

在需要自定义Mock行为的测试用例里,直接覆盖Mock的实现:

test('测试自定义Mock行为的场景', async () => {
  // 临时修改getUser的返回值
  getUser.mockImplementation(() => Promise.resolve({ id: 2, name: 'Custom Test User' }));

  // 执行业务逻辑并断言
  const profile = await userService.fetchUserProfile(2);
  expect(profile).toEqual({ id: 2, name: 'Custom Test User' });
});

3. 自动恢复原始Mock

通过afterEach钩子,在每个测试用例执行完毕后恢复原始Mock并清除调用记录:

afterEach(() => {
  // 恢复原始的Mock实现
  getUser.mockImplementation(originalGetUserImpl);
  // 清除调用记录,避免影响下一个测试的断言
  getUser.mockClear();
});

方案二:使用jest.spyOn创建可恢复的Mock

这种方式更简洁,spyOn创建的Mock可以直接用mockRestore()快速恢复状态:

1. 初始化Spy Mock

在beforeEach钩子中,为目标方法创建Spy并设置默认Mock行为,确保每个测试开始前都是干净的默认状态:

const utils = require('./utils');
const userService = require('./userService');

beforeEach(() => {
  // 创建Spy并设置默认返回值(同步Mock用mockReturnValue)
  jest.spyOn(utils, 'getUser').mockResolvedValue({ id: 1, name: 'Default Mock User' });
});

2. 单个测试中修改Mock

在目标测试用例里直接覆盖Mock行为:

test('临时修改Mock实现的测试', async () => {
  // 自定义当前测试的Mock返回
  utils.getUser.mockResolvedValue({ id: 3, name: 'Temporary Test User' });

  const result = await userService.fetchUserProfile(3);
  expect(result).toEqual({ id: 3, name: 'Temporary Test User' });
});

3. 自动恢复原始Mock

在afterEach里调用mockRestore(),直接恢复到初始的默认Mock状态:

afterEach(() => {
  // 恢复Mock到初始状态
  utils.getUser.mockRestore();
});

关键注意点

  • 两种方案都利用了Jest的测试隔离特性:每个测试用例执行前后都会触发钩子,确保Mock状态不会跨测试污染。
  • 如果是同步Mock,把mockResolvedValue换成mockReturnValue即可。
  • 上述所有API在Jest v21中完全兼容,不用担心版本问题。

内容的提问来源于stack exchange,提问作者Andrea Carraro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:22:44