единичный тест "all + takeEvery" - PullRequest
0 голосов
/ 17 октября 2019

Я новичок в реакции. Пожалуйста, помогите мне с модульным тестом для Redx-Saga / Effecs. Допустим, у меня есть эффекты избыточности для отдельной функции

export function* appEffects() {
    yield all([
        takeEvery(Types.CONFIGURE_LANGUAGE, configureLanguage),
        // other effects for this feature (removed to simplify example)
    ]);
}

function* configureLanguage(action: Actions.ConfigureLanguageAction) {
    const currentLanguage: string = 'en'; // simplified example
    yield put({ type: Types.SET_CURRENT_LANGUAGE, payload: currentLanguage });
}

Я могу проверить configureLanguage напрямую с помощью следующего кода

import { runSaga } from 'redux-saga';


    async function recordSaga(saga: any, initialAction: any) {
        const dispatched: any = [];
        await runSaga(
            { dispatch: (action: any) => dispatched.push(action) },
            saga,
            initialAction
        ).toPromise;
        return dispatched;
    }

    it('should configure language', async () => {
        const action = appActions.service.configureLanguage('en');
        const dispatched = await recordSaga(
            configureLanguage
            action
        );
        expect(dispatched).toEqual([{ type: Types.SET_CURRENT_LANGUAGE, payload: 'en' }]);
    });

Как я могу проверить configureLanguage из appEffects? Если я попытаюсь

const dispatched = await recordSaga(
            appEffects
            action
        );

, я получу dispatched === []

1 Ответ

0 голосов
/ 18 октября 2019

Вы не вызываете метод toPromise для возврата обещания - сейчас вы await используете сам метод toPromise, поэтому recordSaga продолжается до завершения runSaga и, таким образом, dispatched остаетсяпусто, когда вы доберетесь до expect.

    async function recordSaga(saga: any, initialAction: any) {
        const dispatched: any = [];
        await runSaga(
            { dispatch: (action: any) => dispatched.push(action) },
            saga,
            initialAction
        ).toPromise(); // update here
        return dispatched;
    }
...