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

如何在不Mock整个axios库的情况下用Jest监视axios调用?

解决Jest中验证axios调用参数的问题

你当前测试断言失败的核心原因是spy的目标错误:直接调用axios({...})时,执行的是axios默认导出的函数(或内部的axios.request方法),而非axios.Axios构造函数。以下是无需完全Mock整个axios库的解决方案:

方案1:监视axios默认导出函数

通过监视axios的默认导出函数,既能捕获调用行为,又能保留原axios的请求逻辑(让http-request-mock正常拦截请求):

// myFile.test.ts
import axios from 'axios';
import { myCoolEndpoint } from './myFile';
import HttpRequestMock from 'http-request-mock';

const url = 'https://example.com';

describe('sendUploadRequest', () => {
  const HTTP_MOCK = HttpRequestMock.setupForUnitTest('node');
  HTTP_MOCK.put(url, { foo: 1 }, { status: 200 });
  
  // 监视axios默认导出函数,保留原实现
  const axiosSpy = jest.spyOn(axios, 'default').mockImplementation(jest.requireActual('axios').default);

  it('calls axios with correct parameters and handles response', async () => {
    await myCoolEndpoint();

    // 断言axios被调用
    expect(axiosSpy).toHaveBeenCalled();
    // 验证传入的参数符合预期
    expect(axiosSpy).toHaveBeenCalledWith(expect.objectContaining({
      method: 'put',
      url: url
    }));
  });
});

方案2:监视axios.request方法

axios(config)内部最终会调用axios.request(config),因此也可以直接监视这个方法:

// myFile.test.ts
describe('sendUploadRequest', () => {
  const HTTP_MOCK = HttpRequestMock.setupForUnitTest('node');
  HTTP_MOCK.put(url, { foo: 1 }, { status: 200 });
  
  // 监视axios.request方法,保留原实现
  const requestSpy = jest.spyOn(axios, 'request').mockImplementation(jest.requireActual('axios').request);

  it('calls axios.request with correct parameters', async () => {
    await myCoolEndpoint();

    expect(requestSpy).toHaveBeenCalledWith(expect.objectContaining({
      method: 'put',
      url: url
    }));
  });
});

关键说明

  • 无需完全Mock整个axios库,通过jest.requireActual保留原axios的功能,确保http-request-mock能正常拦截请求。
  • 两种方案都能精准捕获businessLogic中对axios的调用,并验证传入的参数是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:37:51