【问题标题】:Redux Saga: Testing plain javascript function inside my saga with redux-saga-test-plan and jestRedux Saga:使用 redux-saga-test-plan 和 jest 在我的 saga 中测试纯 javascript 函数
【发布时间】: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 调用失败,我可以在添加所有时区废话之前让它通过。有人有任何提示吗?提前谢谢你!

【问题讨论】:

    标签: redux jestjs redux-saga redux-saga-test-plan


    【解决方案1】:

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

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

    其他一切正常!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2018-06-10
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多