首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用jest测试axios拦截器

如何用jest测试axios拦截器
EN

Stack Overflow用户
提问于 2021-01-31 14:20:10
回答 3查看 11.3K关注 0票数 13

在我的项目中,我有一个名称空间,它导出一些使用Axios的函数,在同一个文件中,我向axios实例添加了一个拦截器,如下所示:

代码语言:javascript
复制
axios.interceptors.response.use(
    (res) => res,
    (error) => {
      if (
        error.response &&
        (error.response.status?.toString() === "400" ||
          error.response.status?.toString() === "403" ||
          error.response.status?.toString() === "404")
      ) {
        return Promise.reject(
          Error(JSON.stringify(error.response.data?.status?.errors[0]))
        );
      } else if (error.response) {
        return Promise.reject(
          Error(
            `server responsed with the following code: ${error.response?.status} and the following message: ${error.response?.statusText}`
          )
        );
      } else if (error.request) {
        return Promise.reject(
          Error(
            "The request was made but no response was received, check your network connection"
          )
        );
      } else Promise.reject(error);
    }
);

我想测试这个拦截器是否像预期的那样工作,我在这里搜索表单并搜索了很多,但是所有的答案基本上都是在嘲笑拦截器,而不是测试它。

我试过:

  1. 模拟了axios请求的响应,并检查了返回的AxiosPromise,但它只包含我所模拟的结果。当我使用mockResolvedValue.
  2. I进行模拟时,它似乎忽略了拦截器,尝试向模拟的axios实例中添加了一个拦截器,但这也不起作用。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2021-03-07 05:24:07

您必须模拟拦截器并运行回调。

下面是一个如何做到这一点的例子:

httpService.ts

代码语言:javascript
复制
import axios from "axios";
import { toast } from "react-toastify";

axios.interceptors.request.use((config) => {
  config.baseURL = process.env.API_URL || "http://localhost:5000";
  return config;
});

axios.interceptors.response.use(null, (error) => {
  const expectedError =
    error.response &&
    error.response.status >= 400 &&
    error.response.status < 500;

  if (!expectedError) {
    toast.error("An unexpected error occured");
  }

  return Promise.reject(error);
});

export default {
  get: axios.get,
  post: axios.post,
  put: axios.put,
  delete: axios.delete,
};

httpService.test.ts

代码语言:javascript
复制
import axios from "axios";
import { toast } from "react-toastify";
import "./httpService";

jest.mock("axios", () => ({
  __esModule: true,
  default: {
    interceptors: {
      request: { use: jest.fn(() => {}) },
      response: { use: jest.fn(() => {}) },
    },
  },
}));

const fakeError = {
  response: {
    status: undefined,
  },
};

const mockRequestCallback = (axios.interceptors.request.use as jest.Mock).mock
  .calls[0][0];
const mockResponseErrorCallback = (axios.interceptors.response.use as jest.Mock)
  .mock.calls[0][1];
const toastErrorSpy = jest.spyOn(toast, "error");

beforeEach(() => {
  toastErrorSpy.mockClear();
});

test("request error interceptor", () => {
  expect(mockRequestCallback({})).toStrictEqual({
    baseURL: "http://localhost:5000",
  });
});

test("unexpected error on response interceptor", () => {
  fakeError.response.status = 500;

  mockResponseErrorCallback(fakeError).catch(() => {});
  expect(toastErrorSpy).toHaveBeenCalled();
});

test("expected error on response interceptor", () => {
  fakeError.response.status = 400;

  mockResponseErrorCallback(fakeError).catch(() => {});
  expect(toastErrorSpy).not.toHaveBeenCalled();
});
票数 3
EN

Stack Overflow用户

发布于 2021-01-31 14:53:01

如果不使用axios来提取函数并对其进行测试呢?

代码语言:javascript
复制
import axios, { AxiosError, AxiosResponse } from 'axios'

export const onFullfilled = (response: AxiosResponse) => {
  // Your interceptor handling a successful response
}
export const onRejected = (error: AxiosError) => {
  // Your interceptor handling a failed response
}

axios.interceptors.response.use(onFullfilled, onRejected)

现在,您可以测试对axios依赖较少的函数onFullfilled和onRejected。

票数 2
EN

Stack Overflow用户

发布于 2021-12-10 09:17:37

使用此模拟功能

代码语言:javascript
复制
jest.mock('axios', () => {
   return {
      interceptors: {
         request: {
            use: jest.fn(),
            eject: jest.fn()
         },
         response: {
            use: jest.fn(),
            eject: jest.fn()
         },
      },
   };
});
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65980172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档