Я использую 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
?