单元测试拦截器(axios)

时间:2016-10-31 19:19:12

标签: unit-testing http mocha sinon axios

我在axios react应用中使用redux来进行api通话。我添加了这个拦截器来拦截所有api调用的响应,并在状态代码为401时将用户重定向到登录。

axios.interceptors.response.use((response) => {
  if (response.status === 401) {
    browserHistory.push('/login');
  }
  return response;
});

我正在对此进行单元测试,并在browserHistory间谍上断言要调用,但我不确定为什么我的测试会一直失败。经过大量尝试后,我有点陷入困境,无法解决问题。我使用moxios来模拟回复。

测试

let sandbox;

  beforeEach(() => {
    moxios.install();
    sandbox = sinon.sandbox.create();
  });

  afterEach(() => {
    moxios.uninstall();
    sandbox.restore();
  });

  describe('interceptors', () => {
    it('should redirect to login if response status code is 401', (done) => {
      moxios.withMock(() => {
        sandbox.spy(browserHistory, 'push');

        axios.get('/test');

        moxios.wait(() => {
          const request = moxios.requests.mostRecent();
          request.respondWith({
            status: 401,
            response: {}
          }).then(() => {
            expect(browserHistory.push).to.have.been.called; // Fails
            done();
          }).catch(done);
        });
      });
    });
});

任何形式的资源或指南都会非常感激。我很确定我在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:0)

根据文档,您需要监视承诺,

目前如下,

axios.get('/test');

但是你需要像下面那样窥探它,

let onFulfilled = sinon.spy() axios.get('/test').then(onFulfilled)