如何仅为单个测试用例修改Mock对象的返回值?
解决Jest单测试用例修改Mock模块值的问题
你需要先完整保留原mock配置,再在指定测试用例中单独修改目标属性,具体步骤如下:
1. 完整Mock原模块(保留所有原始配置)
不要直接覆盖整个leftMenuWidget,而是通过jest.requireActual引入真实模块的所有内容,这样所有测试默认都会使用原mockConfig的配置:
jest.mock('helpers/test/mockConfig', () => ({ __esModule: true, // 引入真实模块的全部内容,保留原始配置 ...jest.requireActual('helpers/test/mockConfig'), }));
2. 在单个测试用例中修改目标属性
获取mock模块的引用,在需要的测试里修改filterByBadge的值,测试完成后可以手动恢复或者用钩子自动重置,避免影响其他测试:
方式一:手动重置
test('仅在此测试中让filterByBadge为undefined', () => { // 获取mock模块的引用 const mockConfig = require('helpers/test/mockConfig'); // 保存原始值,方便后续恢复 const originalFilter = mockConfig.skillGames.leftMenuWidget.filterByBadge; // 修改为undefined mockConfig.skillGames.leftMenuWidget.filterByBadge = undefined; // 执行你的测试逻辑 // ... // 测试结束后恢复原始值 mockConfig.skillGames.leftMenuWidget.filterByBadge = originalFilter; }); test('其他测试使用原配置', () => { // 这里filterByBadge依然是'exclusive' const mockConfig = require('helpers/test/mockConfig'); expect(mockConfig.skillGames.leftMenuWidget.filterByBadge).toBe('exclusive'); });
方式二:用钩子自动重置(更省心)
如果有多个测试,可以用beforeEach在每次测试前自动重置为原始值:
// 提前获取mock模块的引用 const mockConfig = jest.mocked(require('helpers/test/mockConfig')); beforeEach(() => { // 每次测试前重置为原始值 mockConfig.skillGames.leftMenuWidget.filterByBadge = 'exclusive'; }); test('测试filterByBadge为undefined的场景', () => { mockConfig.skillGames.leftMenuWidget.filterByBadge = undefined; // 执行测试逻辑 }); test('其他测试保持原配置', () => { expect(mockConfig.skillGames.leftMenuWidget.filterByBadge).toBe('exclusive'); });
为什么你原来的做法不行?
你之前的代码直接在jest.mock里重新定义了skillGames.leftMenuWidget,完全去掉了filterByBadge属性,导致所有测试中这个值都是undefined。而通过jest.requireActual引入真实模块内容后,就能保留所有原始配置,再针对性修改单个属性。
内容的提问来源于stack exchange,提问作者Tigran Khachatryan
相关产品推荐
相关产品推荐

