使用redux-saga进行集成测试的最佳方法

时间:2019-05-09 02:07:11

标签: redux-saga

我正在一个使用redux-saga来管理API调用状态更改的项目。

我已经看到了很多关于如何对传奇进行单元测试的示例,但是我可以应用到实际进行集成测试的示例中却很少。我们将jest用于断言。

我想验证一下,当我们的用户单击“保存”时,是否调度了正确的操作,该操作调用了正确的传奇,然后从API中获取了一些数据,从而更改了状态。我想测试整个流程。如果API被模拟,那就很好。

该代码最初是在Typescript中使用的,但是为了简单起见,将其更改为普通的JS。我们正在使用typescript-fsa创建操作,即actionCreator所指的动作。

我不知道在给定动作的情况下如何实际测试传奇。在这种情况下,FETCH_ITEMS_STARTED动作将使一切开始。这触发了调用handleFetchItems的观察者。这顺应了另一个生成器,该生成器会产生一个承诺,该承诺会在API调用完成时得到解决,并应与结果一起调度一个FETCH_ITEMS_DONE操作。

function* handleFetchItems (action) {
    yield call(
        helperGenerator, 
        action, 
        actionCreator,
        function (payload) {
            // more code goes here...
            return api.getItems(payload);
        }
    );
}

function* helperGenerator (action, actionCreator, callback) {
    let result = yield call(function () {
        return callback(action.payload);
    });
    yield put(actionCreator.done({
        params: action.payload,
        result
    }));
}

function* watcher () {
   yield takeEvery(items.started, handleFetchItems);
}

1 个答案:

答案 0 :(得分:1)

如果有人仍然有兴趣,我就此主题发布了an article。这里有一些注意事项:

使用redux-saga-test-plan

  • 您可以执行单元测试
  • 您可以创建集成测试
  • 可以在应用程序状态的上下文中测试sagas。您可以添加将在集成测试中使用的reducer,指定静态状态,检查最终状态。
  • 您可以模拟sagas的效果创建者,因此可以使用API​​
  • 您可以测试包括所有孩子在内的整个根源传奇