如何在Vitest的每个测试用例中重新Mock JSON文件导入?
解决Vitest中Mock JSON文件不生效的问题
问题根源
你之前的代码无效的核心原因:JSON文件导入后是静态对象,但你把mock的default设成了vi.fn()(函数)。validateData直接使用导入的对象,不会调用这个函数,所以mockReturnValueOnce的配置完全没作用,自然会读取真实的JSON文件。
可行解决方案
方案一:用vi.doMock在每个测试中动态Mock
这种方式通过重置模块缓存,让每个测试都能独立Mock JSON文件:
import { validateData } from './你的模块路径'; describe('validateData', () => { afterEach(() => { vi.resetModules(); // 重置模块缓存,保证测试隔离 }); test('验证有效数据', async () => { const obj1 = { id: 1, name: "obj1" }; // 动态Mock JSON文件 vi.doMock('data/data.json', () => ({ default: { obj1 } })); // 重置模块后需重新导入validateData const { validateData } = await import('./你的模块路径'); expect(validateData()).toStrictEqual([]); }); test('验证缺失字段的情况', async () => { const obj1 = { id: 1, name: undefined }; vi.doMock('data/data.json', () => ({ default: { obj1 } })); const { validateData } = await import('./你的模块路径'); expect(validateData()).toStrictEqual(['Missing name for obj1']); }); });
方案二:用可修改变量共享Mock数据
适合需要复用Mock逻辑的场景,通过动态返回变量的方式,在测试中直接修改Mock内容:
// 定义可修改的Mock数据变量 let mockData = {}; // 提前Mock JSON模块,返回mockData的动态引用 vi.mock('data/data.json', () => ({ get default() { return mockData; } })); import { validateData } from './你的模块路径'; const baseObj = { id: 1, name: "obj1" }; describe('validateData', () => { beforeEach(() => { // 每个测试前重置Mock数据 mockData = {}; }); test('验证有效数据', () => { mockData = { obj1: baseObj }; expect(validateData()).toStrictEqual([]); }); test('验证缺失字段的情况', () => { mockData = { obj1: { ...baseObj, name: undefined } }; expect(validateData()).toStrictEqual(['Missing name for obj1']); }); });
内容的提问来源于stack exchange,提问作者Felix4
相关产品推荐
相关产品推荐

