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

如何在Jest的单条测试用例中禁用指定的Axios Mock模拟

问题根因

你遇到的问题本质是Jest的模块缓存机制导致的:如果你的业务代码(包含getLatestPrice的模块)在测试文件顶部就完成了导入,此时axios已经被替换为mock版本并缓存,你在测试用例内部调用jest.unmock或者修改mock对象属性,都不会影响已经导入的业务代码持有的axios引用。

方案1:按测试用例动态导入依赖(完全禁用mock)

通过jest.resetModules清空模块缓存,按用例粒度控制依赖导入,确保需要真实axios的用例导入时已经关闭mock:

describe(`getLatestPrice`, () => {
  // 每次执行用例前清空所有模块缓存,避免用例间互相影响
  beforeEach(() => {
    jest.resetModules();
  });

  it(`throws an error when the response is bad`, async () => {
    // 未关闭mock,导入的业务代码依赖mock版axios
    const { getLatestPrice } = require('./你的业务模块路径');
    // 补充:异步函数抛出错误需要用rejects断言
    await expect(getLatestPrice(assetCode)).rejects.toThrow();
  });

  it(`gets a single price by stream code`, async () => {
    // 先关闭axios mock
    jest.unmock("axios");
    // 再导入业务代码,此时依赖的是真实axios
    const { getLatestPrice } = require('./你的业务模块路径');
    const price = await getLatestPrice(assetCode);
    expect(price).toEqual({
      // 你的预期返回值
    });
  });
})

方案2:修改mock函数实现(局部替换mock逻辑)

如果不想修改导入逻辑,可以把mock的create方法改为Jest mock函数,单条用例临时替换为真实实现:

  1. 先修改__mocks__/axios.js的create为mock函数:
// __mocks__/axios.js
const axios = jest.createMockFromModule("axios");
const log = console.log.bind(console);

// 改为jest mock函数,支持动态修改实现
axios.create = jest.fn(() => {
  log(`Running axios.create`);
  return {
    get: jest.fn(() => Promise.resolve({
      status: 500,
      statusText: "Internal Server Error",
      body: {
        onFire: "Mock API response from mock axios module",
      },
    })),
  };
});

module.exports = axios;
  1. 测试用例中临时替换create的实现:
// 顶部提前导入依赖即可
const { getLatestPrice } = require('./你的业务模块路径');
const mockAxios = require('axios');
const actualAxios = jest.requireActual('axios');

describe(`getLatestPrice`, () => {
  // 每个用例执行后恢复mock的原始实现
  afterEach(() => {
    mockAxios.create.mockRestore();
  });

  it(`throws an error when the response is bad`, async () => {
    await expect(getLatestPrice(assetCode)).rejects.toThrow();
  });

  it(`gets a single price by stream code`, async () => {
    // 临时替换为真实axios的create实现
    mockAxios.create.mockImplementation(actualAxios.create);
    const price = await getLatestPrice(assetCode);
    expect(price).toEqual({
      // 你的预期返回值
    });
  });
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:36:02