Redux Saga:使用 redux-saga-test-plan 和 jest 在我的 saga 中测试纯 javascript 函数

Posted

技术标签:

【中文标题】Redux Saga:使用 redux-saga-test-plan 和 jest 在我的 saga 中测试纯 javascript 函数【英文标题】:Redux Saga: Testing plain javascript function inside my saga with redux-saga-test-plan and jest 【发布时间】:2018-01-22 15:52:20 【问题描述】:

我试图弄清楚我是如何测试包含常规 ol' javascript 函数的 saga 的。

这是我的传奇:

export function* watchGetActivities() 
    yield takeLatest(actionTypes.GET_ACTIVITIES, getActivitiesSaga);


function* getActivitiesSaga() 
    try 
        const activities = yield call(api.getActivities);
        const timezone= yield call(getTimezone);
        const activityWithTimezone=attachTimeZoneToActivities(activities.data,timezone.data);
        yield put(getActivitesSuccess(activityWithTimezone));
     catch (e) 
        yield put(getActivitiesFailure());
        yield put(showModal(modalTypes.ERROR, 'Could not retrieve activities.'));
    

第三个 const 调用的函数(这实质上是循环通过从 api 检索到的活动并将它们组合起来):

export const attachTimeZoneToActivities= (activities,timezones)=>
    activities.forEach(function (activity) 
        activity['timezone']=getActivityTimeZone(timezones,activity.start_epoch_ms)
    )
return activities;

最后,我使用 redux-saga-test-plan 进行的测试:

it('fetches activities from the activities API', () => 
    const fakeActivity =  data: foo: 'bar'  ;
    const fakeTimezone=  data: timezone: 'denver'  ;
    const fakeAttachTimeZoneToActivities=foo:'bar',timezone: 'denver';
    return expectSaga(watchGetActivities, api)
        .provide([
            [call(api.getActivities), fakeActivity],
            [call(getTimezone),fakeTimezone],
            [matchers.call.fn(attachTimeZoneToActivities), fakeAttachTimeZoneToActivities]
            [matchers.call.fn(getActivityTimeZone), 'denver']
        ])

        .put(activity.getActivitesSuccess( foo: 'bar',timezone:'denver'))
        .dispatch(activity.getActivities())
        .silentRun()
);

无论出于何种原因,传奇故事立即导致 api 调用失败,我可以在添加所有时区废话之前让它通过。有人有任何提示吗?提前谢谢你!

【问题讨论】:

【参考方案1】:

问题是我忘记了 sagas 中的函数需要使用 saga 效果调用,所以对于第三个 const 需要像这样调用:

const activityWithTimezone= yield call(attachTimeZoneToActivities, activities.data,timezone.data);

其他一切正常!

【讨论】:

以上是关于Redux Saga:使用 redux-saga-test-plan 和 jest 在我的 saga 中测试纯 javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章

关于 redux-toolkit redux-saga 的一些问题

手写Redux-Saga源码

Redux-saga

redux-saga

redux-saga基本用法

为啥使用 Redux-Observable 而不是 Redux-Saga?