无法成功模拟 axios 拦截器的 baseurl 调用

时间:2021-03-22 13:48:49

标签: javascript unit-testing axios jestjs

我需要 Axios 测试方面的帮助。所以我创建了一个处理刷新令牌功能的 Axios 拦截器。但是当我运行测试时,当我启动 API 时测试成功,但由于连接错误而失败。我认为我没有嘲笑那个拦截器。有什么解决办法吗?

这是我的实现

  //Api.js

import axios from 'axios';
import Cookies from 'js-cookie';
import { refreshAccessToken } from '../api/authApi';
const baseAPI = axios.create();

// Request interceptor for API calls
baseAPI.interceptors.request.use(
  config => { 
    const keys = Cookies.get("access_token")
    config.headers = { 
      'Authorization': `Bearer ${keys}`,
      'Accept': 'application/json',
      'Content-Type': 'application/x-www-form-urlencoded'
    }
    config.baseURL = "http://localhost:8080"
    return config;
  },
  error => {
    Promise.reject(error)
});

// Response interceptor for API calls
baseAPI.interceptors.response.use((response) => {
  return response
}, async function (error) {
  console.log(error);
  const originalRequest = error.config;
  if (error.response.status === 403 && error.response.data.code === "invalid_token") {
    const access_token = await refreshAccessToken({
      'refresh_token': Cookies.get("refresh_token"),
    });
    Cookies.set("access_token", access_token);            
    baseAPI.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;
    return baseAPI(originalRequest);
  }
  else {
    console.log(error);
    return;
  }
});

export { baseAPI };

这是我的测试代码

 //Api.test.js
import axios from 'axios';
import { baseAPI } from './Api';
import { refreshAccessToken } from '../api/authApi';
import Cookies from 'js-cookie';
jest.mock('../api/authApi', () => ({
    refreshAccessToken: jest.fn('foobar').mockResolvedValue('foo')
}))
jest.mock('axios');
describe("axios interceptor response", () => {
    it("should return data if the token not expired", () => {
        expect(baseAPI.interceptors.response.handlers[0].fulfilled({data: "foobar"})).toStrictEqual({data: "foobar"});
    });
    it("should return new token when expired & the refresh token is valid", async () => {
        Cookies.set('refresh_token', 'foobar');
     
            await baseAPI.interceptors.response.handlers[0].rejected({response: {
                status: 403,
                data: {
                    code: "invalid_token"
                }
            }});
        

            expect(refreshAccessToken).toHaveBeenCalledTimes(1);
            expect(Cookies.get('access_token')).toEqual('foo');
        
    });

})

0 个答案:

没有答案