如何对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
相关产品推荐
相关产品推荐

