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

Create React App+Jest环境下Mock Axios实例测试get请求报错如何解决

问题原因

报错是因为api.get()调用后返回值为undefined,本质是你当前 mock 底层axios模块的方式没有正确作用到ApiCrud引入的axiosInstance实例上。单元测试建议优先 mock 直接依赖而非深层依赖,你已经单独编写了axiosInstance的测试用例,所以这里直接 mockaxiosInstance模块即可,无需关心底层axios的实现逻辑。

修复方案(推荐)

直接修改apiCrud.test.js,删除原来对axios的 mock 逻辑,替换为 mock 你自己的axiosInstance模块:

import ApiCrud from "../../../../utils/api/base/ApiCrud";
// 导入mock的axiosInstance用于后续断言(可选)
import { axiosInstance as api } from "../../../../utils/api/base/axiosInstance";

const mockedGet = {
  email: "info@example.com",
}

// 直接mock axiosInstance模块
jest.mock('../../../../utils/api/base/axiosInstance', () => ({
  axiosInstance: {
    get: jest.fn(() => Promise.resolve({ data: mockedGet })),
  }
}))

describe('Test API crud', () => {
  // 每次测试前重置mock调用记录(可选)
  beforeEach(() => {
    api.get.mockClear();
  });

  it ('Test can get base url', () => {
    const apiCrud = new ApiCrud('/fake-url');
    expect(apiCrud.getBaseUrl()).toBe('/fake-url');
  });

  // 也可以用async/await写法更清晰
  it ('Test can fetch items', async () => {
    const apiCrud = new ApiCrud('/fake-url');
    const data = await apiCrud.fetchItems();
    expect(data).toEqual(mockedGet);
    // 额外验证get方法调用参数正确(可选)
    expect(api.get).toHaveBeenCalledWith('/fake-url');
  });
});

保留原mock axios方式的修复方案

如果你一定要保留对axios的 mock 逻辑,只需要在测试用例中手动给axiosInstance的get方法绑定 mock 实现即可:

import ApiCrud from "../../../../utils/api/base/ApiCrud";
import { axiosInstance as api } from "../../../../utils/api/base/axiosInstance";

const mockedGet = {
  email: "info@example.com",
}

jest.mock('axios', () => {
  return {
    create: jest.fn(() => ({
      get: jest.fn(),
      interceptors: {
        request: { use: jest.fn(), eject: jest.fn() },
        response: { use: jest.fn(), eject: jest.fn() }
      }
    }))
  }
})

describe('Test API crud', () => {
  it ('Test can get base url', () => {
    const apiCrud = new ApiCrud('/fake-url');
    expect(apiCrud.getBaseUrl()).toBe('/fake-url');
  });

  it ('Test can fetch items', async () => {
    // 手动给get方法绑定返回值
    api.get.mockResolvedValue({ data: mockedGet });
    const apiCrud = new ApiCrud('/fake-url');
    const data = await apiCrud.fetchItems();
    expect(data).toEqual(mockedGet);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:45:04