如何mock apisauce使用的axios?Jest测试报错修复方法
故障原因
测试失败的核心原因有3个:
TagApi中的apisauce属性初始值是空对象,通过as ApisauceInstance做类型断言只是骗过了TS类型检查,运行时这个对象根本没有axiosInstance属性、也没有get请求方法,测试初始化MockAdapter的时候取TagApi.apisauce.axiosInstance会直接拿到undefined,后续调用getUserTags时会抛出「找不到get方法」的异常。- 测试文件中冗余导入了
axios但未使用,部分TS严格配置下会直接抛编译错误。 - 没有做测试隔离,mock实例未重置可能污染其他测试用例。
修复方案
- 测试执行前先初始化apisauce实例,注入到
TagApi.apisauce属性中,不要用空对象+类型断言的写法伪造实例。 - 删除未使用的冗余导入。
- 每个用例执行完重置mock实例,避免影响其他测试。
- 确认
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
相关产品推荐
相关产品推荐

