我正在使用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
的情况下进行测试?