我在Axios中设置了一个拦截器,该拦截器将刷新令牌,然后在初始HTTP响应为401时重试该调用。
我试图通过模拟Axios请求以返回401,然后返回有效响应(请参见下面的简化版本)并断言它被调用两次来对这种逻辑进行单元测试。
我的问题是,因为我在嘲笑请求,所以拦截器似乎没有运行。我没有重试请求,而是得到了stubAuthError
的返回。
有什么方法可以实现我的追求,还是有更好的方法来测试?
index.js
const axios = require('axios');
axios.interceptors.response.use(
response => response,
error => {
const status = error.response ? error.response.status : null;
if (status === 401) {
return makeRequest();
} else {
return Promise.reject(error);
}
}
);
async function makeRequest() {
return axios.request('url');
}
module.exports = {
makeRequest
};
index.spec.js
const axios = require('axios');
const { makeRequest } = require('./index');
const stubAuthError = { response: { status: 401 } };
const stubResponse = { data: { foo: 'bar' } };
it('should make the request twice', async () => {
expect.assertions(1);
axios.request = jest.fn();
axios.request
.mockRejectedValueOnce(stubAuthError)
.mockResolvedValueOnce(stubResponse);
try {
await makeRequest();
} catch (error) {}
expect(axios.request).toHaveBeenCalledTimes(2);
});