2016-10-29 8 views
1

я написал небольшой перехватчик с помощью axios что бы вымывать localBrowserStorage и будет перенаправлять пользователя на страницу входа, если код ответа является 401. Он отлично работает, но я получение некоторых ошибок в модульном тесте.Мокко: Убедитесь, что сделано() обратного вызова вызывается в этом тесте

Тест

describe('Api Service',() => { 
    let sandbox; 

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

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

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

     axios.get('/test'); 

     moxios.wait(() => { 
      const request = moxios.requests.mostRecent(); 
      request.respondWith({ 
      status: 401, 
      response: {} 
      }).then(() => { 
      expect(browserHistory.push).to.have.been.calledWith('/login'); 
      expect(storage.clear).to.have.been.called; // eslint-disable-line no-unused-expressions 
      done(); 
      }); 
     }); 
     }); 
    }); 
    }); 
}); 

я получаю эти два предупреждения с этим:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Request failed with status code 401 
(node:5338) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): AssertionError: expected push to have been called with arguments /login 

И эта ошибка:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

EDIT:

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

ответ

4

Вам необходимо пройти отбраковки обратно мокко по телефону done в catch обработчика:

request.respondWith({ 
    status: 401, 
    response: {} 
}).then(() => { 
    expect(browserHistory.push).to.have.been.calledWith('/login'); 
    expect(storage.clear).to.have.been.called; // eslint-disable-line no-unused-expressions 
    done(); 
}).catch(done); 

Если вы не обрабатываете отклоненные обещаний, есть шанс, что done никогда не вызывается (в результате тайм-аут).

Например, если одно из ожиданий не удастся, оно вызовет ошибку. Когда это произойдет, вызов done после линий ожидания никогда не будет выполнен. Вы можете (и должны) уловить ошибку с помощью предложения .catch, как указано выше. Это должно вызвать done с ошибкой. Код, который я использую, не подходит для:

.catch(function(err) { 
    done(err); 
}) 
+0

Не могли бы вы объяснить это немного больше, чтобы я полностью понял это для будущих ссылок? Кроме того, выполнение того, что вы сказали, не вызывает «шпионов», и тест терпит неудачу. Какие-либо предложения? – Umair

+0

И он по-прежнему бросает «UnhandledPromiseRejectionWarning» – Umair

+0

@Umair, какой? – robertklep

 Смежные вопросы

  • Нет связанных вопросов^_^