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

如何对Axios发起的外部API调用进行Stub打桩返回模拟响应

Axios API 响应打桩正确实现方式

你之前打桩失败的核心原因是:直接调用axios(config)发起请求时,实际触发的是axios实例的request方法,而非init方法,init仅在实例初始化阶段执行,所以打桩init无法拦截请求响应。

1. Sinon 环境打桩方案(你提到的sandbox属于Sinon能力)

1.1 全局拦截默认axios实例请求

const axios = require('axios');
const sinon = require('sinon');

// 定义模拟返回值
const mockResp = {
  data: {}, // 填充你需要返回的响应体内容
  status: 200,
  statusText: 'OK',
  headers: {}
};

// 打桩axios方法本身
const axiosStub = sinon.stub(axios).resolves(mockResp);

// 测试完成后恢复原方法
axiosStub.restore();

1.2 按请求配置定向匹配打桩

如果需要仅匹配特定url、请求方法的请求,使用callsFake做判断:

sinon.stub(axios).callsFake((config) => {
  // 匹配目标请求
  if (config.method === 'get' && config.url === 'xxxxx') {
    return Promise.resolve(mockResp);
  }
  // 其他请求可返回错误或者走真实逻辑
  return Promise.reject(new Error('未匹配到打桩规则'));
});

1.3 自定义axios实例打桩

如果你的业务代码是用axios.create()创建的自定义实例发请求,直接打桩对应实例的request方法即可:

// 业务代码中的自定义实例
const customAxios = axios.create({ baseURL: '/api' });
// 打桩写法
sinon.stub(customAxios, 'request').resolves(mockResp);

2. Jest 环境打桩方案

如果是Jest测试环境,可以直接mock axios模块实现打桩:

// 测试文件顶部声明mock axios
jest.mock('axios');
const axios = require('axios');

test('测试axios请求逻辑', async () => {
  const mockResp = { data: { code: 200, result: 'test' } };
  // 设置模拟返回值
  axios.mockResolvedValue(mockResp);

  // 执行业务请求逻辑
  const res = await yourBusinessRequestFunc();

  // 可验证请求参数是否符合预期
  expect(axios).toHaveBeenCalledWith({
    method: 'get',
    url: 'xxxxx',
    responseType: 'json'
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 04:12:02