我需要 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');
});
})