测试redux-saga takeEvery

时间:2017-01-16 15:48:39

标签: unit-testing redux-saga redux-saga-test-plan

我有以下超级简单的Redux-Saga,我想用Jest测试。

function* nextApi() {
  yield* takeEvery(
    (action) => !!(action.meta && action.meta.next),
    nextApiSaga
  )
}

我已经查看了Redux-Sagas-Test-Plan,但这似乎只允许您对包含Saga Effect Creators的单元测试功能进行单元测试,并且似乎不支持Saga Helpers。还有Redux-Saga-Test但是它只对屈服效应做了一个deepEqual并且没有测试箭头函数。

我希望能够做的是将以下两个对象传递给takeEvery,并看到nextApiSaga仅在第二种情况下被调用。

{ type: 'foo' }

{ type: 'foo', meta: { next: 'bar' } }  

2 个答案:

答案 0 :(得分:1)

我给你留下了关于redux-saga-test-plan的评论,其中包含了saga助手的方法,但你可以轻松地用它来测试takeEvery。使用你的saga调用testSaga,然后使用模式调用takeEvery方法断言(注意我保留对原始匿名函数的引用)和另一个传奇。

const helper = action => !!(action.meta && action.meta.next)

function* nextApi() {
  yield* takeEvery(
    helper,
    nextApiSaga
  )
}

testSaga(nextApi).takeEvery(helper, nextApiSaga)

答案 1 :(得分:0)

采取不同的方法,我想出了这个。不确定它是否是最佳答案,但似乎有效。如果其他人遇到同样的问题并且仍然可以提供更好的建议,请添加此处。

function getTakeEveryFunction(saga) {
  return saga().next().value.TAKE.pattern
}

it('takes actions with meta.next property', () => {
  const func = getTakeEveryFunction(nextApi)
  expect(func({ type:'foo' })).toBe(false)
  expect(func({ type:'foo',  meta: { next: 'bar' } })).toBe(true)
})