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

Jest中如何重置Mock函数并为各测试用例设置不同返回值?

问题原因分析

你遇到的核心问题是在test #1中直接替换了mock.foo的引用:你把mock.foo重新赋值为一个全新的jest.fn()实例,覆盖了jest.mock自动生成的原始mock函数。后续的mockReset()只对这个新函数生效,但测试结束后这个带"default"返回的新函数仍然绑定在mock对象上,导致test #2调用的还是它,而非你预设的通用mock实现。

解决方案

方案1:不替换mock函数,直接修改原有mock的行为

这是最规范的做法,直接在jest.mock生成的原始mock函数上设置返回值,避免覆盖引用:

const mock = require('module-to-mock');

jest.mock('module-to-mock');

describe('tests', () => {
  // 每个测试前重置mock,清除临时返回值设置,恢复通用mock
  beforeEach(() => {
    jest.clearAllMocks();
    // 如果通用mock有默认实现,可在这里重新绑定(比如从__mocks__文件中导入)
    // mock.foo.mockImplementation(通用实现函数);
  });

  it('test #1', async () => {
    // 直接在现有mock.foo上链式设置返回值,不替换整个函数
    mock.foo
      .mockReturnValueOnce(1) // 第一次调用返回1
      .mockReturnValueOnce(2) // 第二次调用返回2
      .mockReturnValue("default"); // 后续调用返回default

    // 执行测试逻辑
  });

  it('test #2', async () => {
    mock.foo.mockImplementationOnce(() => 3);
    // 第一次调用返回3,后续恢复通用mock的返回值

    // 执行测试逻辑
  });
});

方案2:手动恢复原始mock引用

如果必须替换mock函数,可以在测试前后保存并恢复原始mock的引用:

const mock = require('module-to-mock');

jest.mock('module-to-mock');

describe('tests', () => {
  // 保存jest.mock生成的原始mock函数
  const originalFooMock = mock.foo;

  // 每个测试后恢复原始mock
  afterEach(() => {
    mock.foo = originalFooMock;
    jest.clearAllMocks();
  });

  it('test #1', async () => {
    mock.foo = jest
      .fn()
      .mockReturnValueOnce(1)
      .mockReturnValueOnce(2)
      .mockReturnValue("default");

    // 执行测试逻辑
  });

  it('test #2', async () => {
    mock.foo.mockImplementationOnce(() => 3);
    // 此时使用的是原始通用mock函数,行为符合预期

    // 执行测试逻辑
  });
});

内容的提问来源于stack exchange,提问作者User7723337

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:57:25