如何基于单个测试用例修改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
相关产品推荐
相关产品推荐

