Давайте предположим, что у меня есть следующие создатели асинхронных действий:
export const loadUserToken = () => async (dispatch, getState) => {
dispatch({ type: 'LOAD_USER_TOKEN_START' });
try {
const token = await AsyncStorage.getItem('token');
dispatch({ type: 'LOAD_USER_TOKEN_SUCCESS', payload: token });
} catch (error) {
dispatch({ type: 'LOAD_USER_TOKEN_ERROR', payload: error });
}
dispatch(doSomethingHere());
};
export const doSomethingHere = () => async (dispatch, getState) => {
dispatch({ type: 'SOME_TASK_START' });
// ...some logic
dispatch({ type: 'SOME_TASK_END' });
}
У меня есть два вопроса к этому коду:
- Является ли хорошей практикой отправлять асинхронные действия из другого асинхронногоaction?
- Как проверить только loadUserToken создатель асинхронных действий, а не весь поток (doSomethingHere асинхронный создатель действий)?
У меня есть следующий тест (с использованием sinon и redux-mock-store)и я застрял с насмешкой dispatch(doSomethingHere())
внутри loadUserToken.
const error = new Error();
sinon.stub(AsyncStorage, 'getItem').rejects(error);
const expectedActions = [
{ type: Actions.LOAD_USER_TOKEN_START },
{ type: Actions.LOAD_USER_TOKEN_ERROR, payload: error }
];
const store = mockStore(initialState);
return store.dispatch(UserActions.loadUserToken()).then(() => {
expect(store.getActions()).to.eql(expectedActions);
AsyncStorage.getItem.restore();
});
Над выполнением теста также создайте асинхронное создание действий doSomethingHere, но я не хочу высмеивать всю логику этого метода (иногда это может быть длинным и сложным)Мне просто нужно проверить, был ли выполнен этот метод.