victorzadorozhnyy
@victorzadorozhnyy

Как правильно тестировать Reducer в Jest?

Пытаюсь применить на практике Jest тесты которые встроены в create react app
reducer
function reducer(state = initialState, action) {
  switch (action.type) {
// унивирсальный onChange
    case patientActions.ON_CHANGE_PATIENT:
      return {
        ...state,
        [action.payload.field]: action.payload.value,
      };
// если нашли, то открываем модал с информацией
      case patientActions.ON_SEARCH_PATIENT_FOUND:
          return {
              ...state,
              showModal: true,
              modalBodyContainer: <PatientDetails {...action.payload} />,
          };
...

action
// Universal onChange
export const onChangePatient = createAction(patientActions.ON_CHANGE_PATIENT, (value, field) => ({
    value,
    field,
}));

// Search Patient
export const onSearchPatient = (ur, token) => dispatch => (
    callToApiWithToken(`patient/by/ur/${ur}`, token)
        .then(response =>
            (response.data === null) ? dispatch(onSearchPatientNotFound(ur)) : dispatch(onSearchPatientFound(response.data))
        )
        .catch((error) => ({type: patientActions.ON_SUBMIT_PATIENT_ERROR}) )
);

export const onSearchPatientFound = createAction(patientActions.ON_SEARCH_PATIENT_FOUND);
export const onSearchPatientNotFound = createAction(patientActions.ON_SEARCH_PATIENT_NOT_FOUND);

test
describe('Request reducer', ()=>{
    it('has a default states', ()=>{
        expect(reducer(undefined, {type: 'unexpected'})).toEqual(defaultStates)
    }); // Проходит этот тест 

    it(`handle action ${patientActions.ON_SEARCH_PATIENT_FOUND}`, ()=>{
        expect(reducer(undefined,
            {
                type: patientActions.ON_SEARCH_PATIENT_FOUND,
                payload: {
                    showModal: true,
                    modalBodyContainer: {} // Нужно ли сюда писать <PatientDetails {...action.payload} />?
                }

            })
        )
            .toEqual({...defaultStates,
                showModal: true,
                modalBodyContainer: ???
            })
    }) // не проходит

it(`handle action ${patientActions.ON_CHANGE_PATIENT}`, ()=>{
        expect(reducer(undefined, {
            type: patientActions.PATIENT_INIT_STATE,
            payload: {
                value: '11122',
                field: 'patient_ur'
            }
        })).toEqual({...defaultStates, patient_ur: '11122'})
    }) // не проходит

Задача пока протестить именно редюсеры. Как заставить это все работать?
PS Код весь работает.
  • Вопрос задан
  • 1708 просмотров
Пригласить эксперта
Ответы на вопрос 2
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
redux.js.org/docs/recipes/WritingTests.html
Вот тут приличные примеры. Должны вам помоч
Ответ написан
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
it(`handle action ${patientActions.ON_CHANGE_PATIENT}`, ()=>{
        expect(reducer(undefined, {
            type: patientActions.PATIENT_INIT_STATE, // тут должно быть patientActions.ON_CHANGE_PATIENT
            payload: {
                value: '11122',
                field: 'patient_ur'
            }
        })).toEqual({...defaultStates, patient_ur: '11122'})
    })


ошибку в этом тесте исправьте, если "пройдет", то думаю дальше все получится. Суть юнит-тестов в том, что вы пишите: было А, применил какую-то функцию (в вашем случае редьюсер), стало Б. Сравнить с В.
Причем "В" вы описываете сами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час