Шутливый шпион для саги «вызов» redux выдает ошибку

#javascript #reactjs #unit-testing #jestjs #redux-saga

Вопрос:

Поэтому я пытаюсь высмеять call функцию с redux-saga/effects помощью jest, и, похоже, она выдает сообщение об ошибке call is not declared configurable .

 import * as mockreduxSagaEffects from 'redux-saga/effects';

test('calls all the appropriate actions', async () => {
    const dispatchedActions = [];


    jest.spyOn(mockreduxSagaEffects, 'call', 'get').mockImplementationOnce(() => someData);

  });
 

Что я делаю не так?

Ответ №1:

Тестирование redux-saga обычными средствами-довольно неприятное дело. Вам следует использовать redux-saga-test-plan, я настоятельно рекомендую его, он очень хорош

Итак, я не вижу саги, которую вы хотите протестировать, но, видя, что вы хотите издеваться .call (), давайте возьмем ее в качестве примера. Я думаю, что если вы поймете это, у вас не возникнет проблем с пониманием других функций redux-saga.

 function* userSaga(api) {
  const user = yield call(api.fetchUser, action.payload);

  yield put({
    type: 'RECEIVE_USER',
    payload: { user, pet },
  });
}

it('fetches the user', () => {
  const fakeUser = { name: 'Jeremy', petId: 20 };
  const fakeDog = { name: 'Tucker' };

  return expectSaga(userSaga, api)
    .provide([
      [call(api.fetchUser, 42), fakeUser],
    ])
    .put({
      type: 'RECEIVE_USER',
      payload: { user: fakeUser, pet: fakeDog },
    })
    .run();
});
 

Обратите внимание, как мы передаем массив с вызовом, который мы хотим смоделировать, и результатом, который мы хотим имитировать. Вы также можете сделать это с помощью select.
Put также очень интуитивно понятен, ваш тест будет ожидать, что сага запустит это действие.

Есть и другие вещи, которые действительно полезны, такие как

 .withReducer(reducer)
.hasFinalState({
   name: 'Tucker',
   age: 12,
 })
 

Таким образом, вы устанавливаете редуктор с начальным состоянием по вашему выбору. После того, как все эффекты будут запущены в соответствии с вашими требованиями к тестированию, redux-saga-test-plan проверит, изменился ли редуктор соответствующим образом.