Как протестировать компонент с поддержкой Redux с помощью библиотеки тестирования React?

#javascript #reactjs #redux #react-testing-library

#javascript #reactjs #redux #react-testing-library

Вопрос:

Я изо всех сил пытаюсь протестировать компонент React без использования rerender функции.

 function renderDom(component, store) {
  return {
    ...render(<Provider store={store}>{component}</Provider>),
    store,
  };
}

it('Should render a TimeEditor component and ensure the  /- buttons function correctly', async () => {
  const store = configureStore(_initialState);
  const spy = jest.spyOn(store, 'dispatch');

  let component = {};
  component = await renderDom(
    <TimeEditor task={store.getState().stdForm.tasks[0]} />,
    store
  );

  const { queryByTestId, findByTestId } = component

  const minusButton = await findByTestId('subtract-minute');
  const plusButton = await findByTestId('add-minute');
  let duration = await findByTestId('start-service-duration');

  expect(duration.innerHTML).toEqual('5');
  expect(minusButton).toBeDisabled();

  await fireEvent.click(plusButton);
  expect(spy).toHaveBeenCalledTimes(1);
  expect(spy).toHaveBeenCalledWith({
    type: 'UPDATE_TASK_TIME',
    payload: { id: '330d8081-6c32-4d62-b0f1-64cdd28d4b75', estimatedMinutes: 6 },
  });

  // rerender(
  //   <Provider store={store}>
  //     {<TimeEditor task={store.getState().stdForm.tasks[0]} />}
  //   </Provider>
  // );

  await waitForElement(() => findByTestId('start-service-duration'));
  duration = await findByTestId('start-service-duration');
  expect(duration.innerHTML).toEqual('6');
});
 

Я перепробовал все, что мог придумать, чтобы заставить код работать без rerender , но ничего не работает. Чтобы быть более точным, я знаю, что редуктор Redux выполняет свою работу должным образом, но это не отражается обратно в компоненте, поэтому «5» не меняется на «6».

Есть ли способ запустить этот тест без rerender ?

Ответ №1:

Вероятно, проще использовать провайдера в качестве оболочки:

 function renderDom(component, store) {
  const WithStore = ({children}) => <Provider store={store}>{children}</Provider>

  return {
    ...render(component, {wrapper: WithStore}),
    store,
  };
}
 

Таким образом, вам не нужно обращать никакого внимания на поставщика при повторном запуске.