Как смоделировать селекторную функцию с помощью Jest (redux-saga) - PullRequest
0 голосов
/ 31 марта 2020

Мне нужна помощь, издевающаяся над селектором.

Я не уверен, как передать ложное состояние в getSelectedDriver селектор, чтобы получить driver значение?

Когда я запускаю тест, я получаю следующую ошибку:

enter image description here

Сага

export function* fetchUpdateDriver(action: IUpdateDriverAction): SagaIterator {
  const {
    payload: { driverId, landlinePhoneNumber, mobilePhoneNumber }
  } = action;

  const driver = yield select(getSelectedDriver); // how to mock this?

  if (driver) {
    const { response, error } = yield call(updateDriver, {
      currentDriver: driver,
      driverId,
      landlinePhoneNumber,
      mobilePhoneNumber
    });

    if (response) {
      yield put(
        fetchUpdateDriverDetailsSucceeded({
          landlinePhoneNumber,
          mobilePhoneNumber
        })
      );
    } else {
      yield put(fetchUpdateDriverDetailsFailed({ error }));
    }
  }
}

export function* watchFetchUpdateDriverDetails(): SagaIterator {
  yield takeEvery(ACTION_TYPES.FETCH_UPDATE_DRIVER_REQUEST, fetchUpdateDriver);
}

Тест

describe('driver sagas', () => {
  const { watchFetchUpdateDriverDetails } = require('..');

  describe('watchFetchDriverNotWorking', () => {
    it('should dispatch fetchUpdateDriverDetailsSucceeded if there is a response', async () => {
      const payload = parseResponse({
        header: {
          success: true
        }
      });

      mockUpdateDriverDetailsRequestService.mockResolvedValue(payload);

      await expectSaga(watchFetchUpdateDriverDetails)
        .dispatch(
          fetchUpdateDriverDetails({
            driverId: '123',
            landlinePhoneNumber: '123',
            mobilePhoneNumber: '123'
          })
        )
        .put(
          fetchUpdateDriverDetailsSucceeded({
            landlinePhoneNumber: '123',
            mobilePhoneNumber: '123'
          })
        )
        .silentRun();
    });
  });
});

1 Ответ

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

Я нашел способ сделать это с помощью провайдера, чтобы смоделировать селектор. Btw. Я использую библиотеку плана тестов саги.

  await expectSaga(watchFetchUpdateDriverDetails)
    .dispatch(
      fetchUpdateDriverDetails({
        driverId: '123',
        landlinePhoneNumber: '123',
        mobilePhoneNumber: '123'
      })
    )
    .provide({ // mocking the select function
      select({ selector }, next) {
        if (selector === getSelectedDriver) {
          return true;
        }
        return next();
      }
    })
    .put(
      fetchUpdateDriverDetailsSucceeded({
        landlinePhoneNumber: '123',
        mobilePhoneNumber: '123'
      })
    )
    .silentRun();
});
...