Как вы издеваетесь над Firebase SDK при тестировании создателей действий в Redux? - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над POC с React, Redux и Firebase.В настоящее время я смотрю, как протестировать создателей действий.Я следовал этому руководству - https://redux.js.org/recipes/writing-tests#async-action-creators, и это было полезно до сих пор.Тем не менее, в качестве простого примера я хочу проверить, что действие отправляется после успешной аутентификации с помощью Firebase следующим образом -

Создатель действия

export const authenticate = (username, password) => {
  return dispatch => {
    firebase.auth().signInWithEmailAndPassword(username, password)
      .then(() => {
        dispatch(authenticationSuccessful())
      })
      .catch(() => {

      });
  }
};

Действие

const authenticationSuccessful = () => {
  return {
    type: actionTypes.AUTHENTICATION_SUCCESSFUL
  };
};

Что касается тестирования, у меня есть шутки, redux-mock-store и ожидаем.Я исследовал, что другие люди используют для этого сценария, и я не нашел окончательного ответа, я также посмотрел на https://www.npmjs.com/package/firebase-mock, но я не знаю, является ли это популярным выбором в рамкахсообщество.

Заранее благодарен за любую помощь!

1 Ответ

0 голосов
/ 18 июня 2018

Этот ответ отвечает всем требованиям. Лучший способ получить код для модульного тестирования, который зависит от http-вызовов с использованием Jest?

В соответствии с этим ответом это перезапишет signInWithEmailAndPassword, позволяя вашему кодупройти без удара огненной базы.В приведенном ниже примере может потребоваться некоторая настройка.Не уверен в области действия dispatch.

jest.mock('pathToFireBase', () => ({
   signInWithEmailAndPassword(email, password) {
     return Promise.resolve({name: 'someUser'})
   }
}))

const dispatch = jest.fn();
firebase.auth().signInWithEmailAndPassword(username, password)
expect(dispatch.mock.calls.length).toBe(1);

Другой вариант (для Node.js) - использовать что-то вроде VCR .Опция сепия .Он построен LinkedIn, поэтому, вероятно, лучше поддерживается и проверяется.С помощью этого инструмента вы записываете свои запросы один раз, сохраняя ответы и воспроизводя их при вызове.Эта опция позволяет избежать насмешек, но поддерживает быстрые тесты uint с предопределенными ответами.Я не знаю, какой вариант веб-интерфейса, как этот.


Firebasemock выглядит как отличный вариант.Хотя я не вижу signInWithEmailAndPassword.Аутентификация выполняется путем явной установки состояния. пример аутентификации .

mocksdk.auth().changeAuthState({
  uid: 'testUid',
  provider: 'custom',
  token: 'authToken',
  expires: Math.floor(new Date() / 1000) + 24 * 60 * 60,
  auth: {
    isAdmin: true
  }
});
mocksdk.auth().flush();
console.assert(document.location.href === '#/admin', 'redirected to admin');
...