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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:25:06