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

如何为每个测试用例设置不同的Mock实现?

如何为每个测试用例设置不同的Mock实现?

我刚从Jest切换到Vitest的时候,也被这个问题卡过一阵,其实只要掌握正确的重置和设置方式,每个用例独立定制mock超简单!

先看你的代码结构,用vi.hoisted()来提升mock函数的写法是对的,这样vi.mock才能正确访问到f。要实现每个测试用例用不同的mock值,核心是避免用例之间的mock状态污染,然后在每个用例里单独设置返回值或实现。

给你调整后的完整代码示例:

// test.ts
import { a } from './asd';

const { f } = vi.hoisted(() => ({
  f: vi.fn(),
}));

vi.mock('../../../api/ApiProvider', () => ({
  f,
}));

describe('Test', () => {
  // 每个测试用例执行前,重置mock的状态
  beforeEach(() => {
    // mockReset会清空mock的调用记录和之前设置的返回值,保证每个用例从零开始
    f.mockReset();
  });

  it('sample test case', () => {
    // 第一个用例设置mock返回42
    f.mockReturnValue(42);
    // 这里根据你的实际逻辑写断言,比如a函数内部调用了f,所以预期对应的结果
    expect(a()).toEqual(1);
  });

  it('sample test case2', () => {
    // 第二个用例设置完全不同的返回值
    f.mockReturnValue(100);
    expect(a()).toEqual(/* 这里填对应100返回值的预期结果 */);
  });
});

几个关键细节要注意:

  • 如果你只是想清空调用记录,不想重置返回值,可以用f.mockClear()代替mockReset(),根据你的测试需求选就行。
  • 要是你需要的不是固定返回值,而是自定义的函数逻辑,把mockReturnValue换成mockImplementation就好,比如:
    f.mockImplementation(() => {
      // 这里写第二个用例专属的mock逻辑
      return '自定义返回';
    });
    
  • 不用beforeEach的话,也可以在每个用例的开头手动调用重置方法,效果是一样的,只是用beforeEach更省心,不用重复写代码。

备注:内容来源于stack exchange,提问作者Stoil Radkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:35:29