Axios

时间:2019-01-03 14:39:16

标签: javascript axios jestjs

我在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);
});

0 个答案:

没有答案