如何测试我的redux saga spawn代码块

时间:2017-11-27 05:39:43

标签: jestjs redux-saga

我想使用jest测试spawn块...我在beforeEach块中创建了一个生成器,并且我正在检查 generator.next()函数,像这样

    beforeEach(() => {
        generator = saga.postCompare();
    });

和我的代码一样

    export function* LoadData() {
      let someVariable;
      try {
       for (let index = 0; index < 3; index += 1) {
            yield spawn(loadUserData, varaiable1, variable2);
       }
     }
   }

   export function* loadUserData(Prop1, Prop2) {
      try {
        const userData = yield call(serverManager.fetch1,prop1, prop2 );
        const isUserSelected = yield* isUserSelected();
        if (!isUserSelected) {
          return;
        }
        yield put(
          Actions.onRequestSucceededForUser(userData.data.value, prop1),
        );
      } 
    }

1 个答案:

答案 0 :(得分:0)

  

我想使用jest测试spawn块

也许接受最简单的解决方案来测试redux-saga生成器 - 只是根据定义它们是如何工作的,而不是嘲笑任何东西。因此,每个saga只是生成器函数,它在每个yield运算符处产生对父函数的控制流。此外,saga-effects事实上什么都不做 - 只需创建特殊表单对象,redux-saga内部流程管理器(https://github.com/redux-saga/redux-saga/blob/master/src/internal/io.js)可以接受

因此,您可以轻松地从测试运行器运行测试不足的saga函数,并对返回的操作执行断言,如下所示:

const saga = LoadData();
assert(saga.next()).to.be.deep.equal(spawn(loadUserData, varaiable1, variable2))
assert(saga.next()).to.be.deep.equal(spawn(loadUserData, varaiable1, variable2))
assert(saga.next()).to.be.deep.equal(spawn(loadUserData, varaiable1, variable2))

这样就不会执行函数loadUserData,也会创建效果描述符对象