как получить дубль с помощью runSaga / redux-saga - PullRequest
1 голос
/ 07 мая 2019

Я создал функцию recordSaga, ее цель - записать, какие действия были отправлены во время саги.

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,
  };
};

так что давайте скажем, что моя сага вот такая

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

Я хочу написать два теста, которые, как я ожидаю, будут следующими

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()
    ])
  })
})

Однако для теста 2, где между ними стоит take и, конечно, jest (или его подруга)jasmine) кричит на меня: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Я знаю, это потому, что runSaga ждет take(SAVE_DOCUMENT_SUCCESS), но как я могу это высмеять?

1 Ответ

0 голосов
/ 08 мая 2019

Глядя на recordSaga:

export const recordSaga = async (saga, initialAction, state) => {

Кажется, что вы должны передать {type: SAVE_DOCUMENT_SUCCESS} в качестве второго аргумента (то есть initialAction).Это должно вызвать эффект take.

...