如何使用 runSaga / redux-saga 接收拍摄

arn*_*bro 5 testing mocking jasmine jestjs redux-saga

我创建了一个recordSaga函数,它的目标是记录在 saga 期间已经调度了哪些动作。

export const recordSaga = async (saga, initialAction, state) => {
  const dispatched = [];

  const done = await runSaga(
    {
      dispatch: action => dispatched.push(action),
      getState: () => state,
    },
    saga,
    initialAction,
  ).done;

  return {
    dispatched,
    done,
  };
};

Run Code Online (Sandbox Code Playgroud)

所以让我们说我的传奇就是这个

export function* mySaga() {
  const needToSave = yield select(needToSaveDocument);
  if (needToSave) {
    yield put(saveDocument());
    yield take(SAVE_DOCUMENT_SUCCESS);
  }
  yield put(doSomethingElse())
}
Run Code Online (Sandbox Code Playgroud)

我想写两个测试,我希望它们如下

describe('mySaga', async () => {
  it('test 1: no need to save', async () => {    
    const state = { needToSave: false }
    const { dispatched } = await recordSaga(mySaga, {}, state);
    expect(dispatched).toEqual([
      doSomethingElse()
    ])
  })
  it('test 2: need to save', async () => {
    const state = { needToSave: true }
    const { dispatched } = await recordSaga(mySaga, {}, state);
    expect(dispatched).toEqual([
      saveDocument(),
      doSomethingElse()
    ])
  })
})
Run Code Online (Sandbox Code Playgroud)

然而,对于take中间有一个的测试 2,当然jest(或它的女朋友jasmine)对我大喊大叫:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

我知道这是因为runSaga正在等待take(SAVE_DOCUMENT_SUCCESS),但我怎么能模拟呢?

Tom*_*mer 0

通过查看recordSaga

export const recordSaga = async (saga, initialAction, state) => {
Run Code Online (Sandbox Code Playgroud)

看来你应该{type: SAVE_DOCUMENT_SUCCESS}作为第二个参数传递(即initialAction)。这应该会触发take效果。