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

如何mock apisauce使用的axios?Jest测试报错修复方法

故障原因

测试失败的核心原因有3个:

  1. TagApi中的apisauce属性初始值是空对象,通过as ApisauceInstance做类型断言只是骗过了TS类型检查,运行时这个对象根本没有axiosInstance属性、也没有get请求方法,测试初始化MockAdapter的时候取TagApi.apisauce.axiosInstance会直接拿到undefined,后续调用getUserTags时会抛出「找不到get方法」的异常。
  2. 测试文件中冗余导入了axios但未使用,部分TS严格配置下会直接抛编译错误。
  3. 没有做测试隔离,mock实例未重置可能污染其他测试用例。
修复方案
  1. 测试执行前先初始化apisauce实例,注入到TagApi.apisauce属性中,不要用空对象+类型断言的写法伪造实例。
  2. 删除未使用的冗余导入。
  3. 每个用例执行完重置mock实例,避免影响其他测试。
  4. 确认handleResponse方法的逻辑,如果该方法会对apisauce原始响应做转换,对应调整断言即可。
修复后完整测试代码
// 删掉未使用的axios导入
import { create } from 'apisauce'
import { TagApi } from '@/core/src/services/api-objects/TagApi'
import MockAdapter from 'axios-mock-adapter'
// 替换成你项目中handleResponse的实际导入路径
import { handleResponse } from '@/utils/request'

beforeAll(() => {
  // 提前初始化apisauce实例,baseURL随便填即可,mock会拦截请求不会真实发送
  TagApi.apisauce = create({
    baseURL: 'http://localhost'
  })
})

test('mock adapter', async () => {
  const mock = new MockAdapter(TagApi.apisauce.axiosInstance)
  mock.onGet('/users/2/tags/').reply(201, {
    x: 'hello',
  })
  const response = await TagApi.getUserTags(2)
  
  // 如果你的handleResponse做了响应解包,比如直接返回data,下面的断言要对应调整
  expect(response.ok).toBe(true)
  expect(response.status).toBe(201)
  expect(response.data).toEqual({ x: 'hello' })

  // 重置mock,避免污染其他用例
  mock.reset()
})

补充说明:

  • 生产环境初始化TagApi时,也需要把create()生成的真实apisauce实例赋值给TagApi.apisauce,否则线上接口调用也会抛出运行时错误,不要依赖as类型断言掩盖空值问题。
  • 你当前定义的getUserTags接口响应类型是UserTag实例数组,测试中mock返回普通对象{x:'hello'}会触发TS类型报错,如果是测试异常场景可以加类型断言跳过检查,正常场景建议返回符合类型定义的模拟数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:09:19