Vitest无法Mock Axios的isAxiosError方法,单元测试返回500错误求助
问题原因
核心问题出在两方面:
- 自定义的
errorResponse并非Axios官方错误结构,axios.isAxiosError()无法自然识别; - 当前mock的
isAxiosError仅固定返回true,但未关联错误对象的特征判断,导致实际调用时校验逻辑失效。
解决方案
提供两种可行修复方案:
方案一:用Axios官方方法生成标准错误对象(推荐)
这是最贴合Axios逻辑的方式,isAxiosError会自动识别官方错误实例:
- 在测试文件中导入
createError:
import axios, { AxiosResponse, createError } from 'axios'
- 修改测试用例的错误生成逻辑:
it('should throw a customError when axios.post returns a 400 error', async () => { const mockResponse: AxiosResponse= { status:400, statusText:'Bad Request', headers:{}, config:{}, data:{}, } // 生成标准Axios错误对象 const errorResponse = createError( 'Bad Request', {}, // 可传入接口调用的config,空对象不影响测试 mockResponse.status, mockResponse.headers, mockResponse ); const requestMock={id:'xyz',refer:'sample'} vi.spyOn(axios,'post').mockRejectedValueOnce(errorResponse); // 断言抛出的customError结构正确 await expect(myfunction(requestMock)).rejects.toMatchObject({ type: 'bad request', status: 400 }); expect(axios.post).toHaveBeenCalledTimes(1); });
此时axios.isAxiosError(error)会自动返回true,无需额外mock该方法的返回值。
方案二:修正mock的isAxiosError逻辑,匹配自定义错误
若坚持使用自定义错误对象,需让mock函数正确识别错误标记:
修改vi.mock中的isAxiosError实现:
vi.mock("axios", () => { return { default: { post: vi.fn(), // 检查错误对象是否带有自定义的isAxiosError标记 isAxiosError: vi.fn((error) => !!error?.isAxiosError), }, }; });
同时修正测试断言(函数抛出的是customError实例,而非mockResponse.data结构):
await expect(myfunction(requestMock)).rejects.toMatchObject({ type: 'bad request', status: 400 });
额外注意点
- 确保
customError类的属性是可被断言的公开属性; - 保留
vi.resetAllMocks()避免测试用例间的状态污染。
内容的提问来源于stack exchange,提问作者AviX
相关产品推荐
相关产品推荐

