使用firebase进行redux saga异步测试

时间:2018-09-30 08:39:13

标签: javascript reactjs redux jestjs redux-saga

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

所以我要用sagareducers设置页面,
然后我调度登录操作。

如果我测试了流程,那么看来过程在承诺尚未解决之前就一直在期待(认为它们是模拟的),并且存储为空。
如果我将setTimeout事件设置为1毫秒(实际上没有api调用),
然后通过测试。

如何在不使用setTimeout的情况下进行测试?

0 个答案:

没有答案