Асинхронное тестирование RedAX Saga с помощью FireBase - PullRequest
0 голосов
/ 30 сентября 2018

Я использую redux-saga для обработки асинхронных запросов и firebase для аутентификации.
Это мой поток аутентификации:

изменение пользователя в firebase:

export const handleAuthStateChange = curry((dispatch, user) => {
  if (user) {
    return user
      .getIdToken()
      .then(getUser)
      .then(u => dispatch(loginSuccess(u)));
  }
  return dispatch(logoutSuccess());
});

const facebookLogin = () => firebase.auth().signInWithPopup(facebookProvider);

function* providerLogin(action) {
  try {
    yield call(facebookLogin);
  } catch (e) {
    yield put(loginFail(e));
  }
}

getUser это вызов API

Это мой тест:

beforeAll(() => {
  const authUser = {
    getIdToken: () => Promise.resolve('token'),
  };
  const user = {
    email: 'test@test.com',
    name: 'test test',
    uid: '1',
  };
    initialState = {};
    history = createHistory();
    store = configureStore(initialState, history);
    configureFirebase(store.dispatch);

    const mockAuthChange = () =>
      handleAuthStateChange(store.dispatch, authUser);

    jest.spyOn(firebase, 'auth').mockImplementation(() => ({
      signInWithPopup: mockAuthChange,
    }));

    global.fetch = jest.fn().mockImplementation(() =>
      Promise.resolve({
        status: 200,
        json: () => ({
          data: { userLogin: user },
        }),
      }),
    );

    mount(createApp({ store, history, theme, app: <AuthPage /> }));
  });

  test.only('successful facebook login change the logged in user', done => {
    mapDispatchToProps(store.dispatch).facebookLogin();

    // **** 1 ****
    // doesn't work
    expect(store.getState().profile).toEqual(user);
    done();

    // **** 2 ****
    // works
    setTimeout(() => {
      expect(store.getState().profile).toEqual(user);
      done();
    }, 1);
  });

Итак, я устанавливаю страницу с saga и reducers,
, затем отправляюдействие входа в систему.

Если я проверяю поток, то кажется, что процесс продолжается до того момента, пока обещания не будут разрешены (думал, что они являются ложными), и хранилище будет пустым.
Если я установлюsetTimeout событие в течение 1 мс (на самом деле нет вызова API),
затем тестовый пропуск.

Как я могу проверить его без использования setTimeout?

...