使用触发它的操作中的值测试Redux Saga

jol*_*uss 2 reactjs redux redux-saga react-redux

我有一个传奇,可以很好地运行,我调用一个动作并包含一些数据,触发了传奇,它将动作中的值提取出来,进行了API调用,最后以几个yield put-太棒了。

我现在正在尝试测试该传奇故事并解决问题,我编写了一个简单的传奇故事并进行测试以尝试缩小问题所在。

传奇:

function* exampleSaga() {
  while(true) {
    yield take('EXAMPLE_SAGA');
    console.log('what is the value inside example');
    const { value } = yield take('ANOTHER_ACTION')
    console.log('value', value);
    yield take('THIRD_TAKE')
  }
}

export { exampleSaga }
Run Code Online (Sandbox Code Playgroud)

考试:

describe('Saga::Example ', function() {
  it('should take EXAMPLE_SAGA ', () => {
    const saga = exampleSaga()

    expect(saga.next().value).to.deep.equal(take('EXAMPLE_SAGA'))
    expect(saga.next({
      type: 'ANOTHER_ACTION',
      value: 'amazing'
    }).value).to.deep.equal(take('ANOTHER_ACTION'))
    expect(saga.next().value).to.deep.equal(take('THIRD_TAKE'))
  })
})
Run Code Online (Sandbox Code Playgroud)

我期望的是,因为我正在调用next()并传递一个对象(一个模拟的redux动作),所以我应该能够在传奇中从该动作中提取值。

我得到的是:

TypeError: Cannot read property 'value' of undefined
Run Code Online (Sandbox Code Playgroud)

令人沮丧的一件事是,在我的应用程序中,使用以下语法从操作中获取值的传奇作品起作用了:

const { value1, value2 } = yield take('ACTION_NAME')
Run Code Online (Sandbox Code Playgroud)

仅在我尝试测试传奇时才会出现问题。

任何帮助表示赞赏。

mad*_*ox2 5

它按预期工作。在您的代码中,您断言saga正在等待操作(而不是推动操作)。因此,您必须将值对象传递给下一个迭代:

// expecting that saga waits for EXAMPLE_SAGA action
expect(saga.next().value).to.deep.equal(take('EXAMPLE_SAGA'))

// pushing EXAMPLE_SAGA action and expecting that saga waits for ANOTHER_ACTION
expect(saga.next().value).to.deep.equal(take('ANOTHER_ACTION'))

// pushing ANOTHER_ACTION and expecting that saga waits for THIRD_TAKE action
expect(saga.next({
  type: 'ANOTHER_ACTION',
  value: 'amazing'
}).value).to.deep.equal(take('THIRD_TAKE'))
Run Code Online (Sandbox Code Playgroud)