Redux - вызвать асинхронное действие в другом асинхронном действии - PullRequest
0 голосов
/ 22 июня 2019

Давайте предположим, что у меня есть следующие создатели асинхронных действий:

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' });
}

У меня есть два вопроса к этому коду:

  1. Является ли хорошей практикой отправлять асинхронные действия из другого асинхронногоaction?
  2. Как проверить только 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, но я не хочу высмеивать всю логику этого метода (иногда это может быть длинным и сложным)Мне просто нужно проверить, был ли выполнен этот метод.

...