ExpectSaga ставит неудачные утверждения с множественными пут-эффектами - PullRequest
2 голосов
/ 17 апреля 2020

В саге есть несколько путов.

export function* changeItemsSaga(action) {
    const prerequisite1 = yield select(prerequisite1Selector);

    // some processing

    yield put(actions.myAction1(payload1));

    // some more processing

    const prerequisite2 = yield select(prerequisite2Selector);

    // some more processing

    yield put(actions.myAction2(payload2));
}

Как мне записать свои ожидания на путы, когда сага возвращает несколько эффектов?

it('should update items', () =>
    expectSaga(sagas.changeItemsSaga, action)
        .provide([
            [select(prerequisite1), {}],
            [select(prerequisite2), {}],
        ])
        .put([actions.myAction1(payload1), actions.myAction2(payload2)])
        .run());

В модульном тесте ExpectSaga возвращается следующая ошибка:

Saga test error:
put expectation unmet:

Expected
--------
{ channel: null,
  action:
   [ { type: 'MY_ACTION_1',
       payload: { myItem1: [Object] } },
     { type: 'MY_ACTION_2',
       payload: { itemCollection: [Object] } } ] }

Actual:
------
1. { channel: null,
  action:
   { type: 'MY_ACTION_1',
     payload:
      { myItem1:
         { index: 0,
           childItem1: [Object],
           childItem2: [Object] } } } }
2. { channel: null,
  action:
   { type: 'MY_ACTION_2',
     payload: { itemCollection: [ [Object] ] } } }

Этот тоже не работает.

it('should update items', () =>
    expectSaga(sagas.changeItemsSaga, action)
        .provide([
            [select(prerequisite1), {}],
            [select(prerequisite2), {}],
        ])
        .put(actions.myAction1(payload1))
        .put(actions.myAction2(payload2))
        .run());

Возвращает эту ошибку.

Saga test error:
put expectation unmet:

Expected
--------
{ channel: null,
  action:
   { type: 'MY_ACTION_1',
     payload:
      { myItem1:
         { index: 0,
           childItem1: [Object],
           childItem2: [Object] } } } }

Actual:
------
1. { channel: null,
  action:
   { type: 'MY_ACTION_1',
     payload:
      { myItem1:
         { index: 0,
           childItem1: [Object],
           childItem2: [Object] } } } }
2. { channel: null,
  action:
   { type: 'MY_ACTION_2',
     payload: { itemCollection: [ [Object] ] } } }

1 Ответ

0 голосов
/ 24 апреля 2020

Синтаксис provide позволяет вам тестировать конечный эффект саги вместо того, чтобы загружать все ваше состояние.

Вот пример из redux-saga docs -

test('test only final effect with .provide()', () => {
  /*
  * With the .provide() method from expectSaga
  * you can by pass in all expected values
  * and test only your saga's final effect.
  */
  return expectSaga(callApi, 'url')
    .provide([
      [select(selectFromState), selectedValue],
      [call(myApi, 'url', selectedValue), response]
    ])
    .put(success(response))
    .run();
});

При вызове вызова actions 2x, тест выполняется последовательно, а put в середине sagas.changeItemsSaga фактически пропущен.

Похоже, что функция, которую вы могли бы получить, это testSaga , которая даст вам более детальное представление о потоке эффекты.

...