Использовать пользовательский рендер для рендеринга с использованием реагирующей-тестирующей библиотеки

Я использую реагирующую библиотеку, и у меня есть собственный рендер:

const customRender = (node, ...options) => {
  return render(
    <ThemeProvider theme={Theme}>
      <MemoryRouter>{node}</MemoryRouter>
    </ThemeProvider>,
    ...options
  );
};

Я могу использовать это успешно для render в моем тесте, но не для rerender:

test("shows content once data has loaded", () => {
  const { queryByTestId, rerender, debug } = render(
    <ConnectAccount
      currentUser={{
        loading: true
      }}
    />
  );

  expect(queryByTestId("content")).toBeNull();

  rerender(
    <ConnectAccount
      currentUser={{
        user: {
          name: "Test User"
        }
      }}
    />
  );

  debug();
});

Я получаю ошибку TypeError: Cannot read property 'black' of undefined для rerender, Есть ли какой-нибудь способ для рендера использовать пользовательский рендер, поэтому мне не нужно оборачивать каждый рендер в ThemeProvider?

2 ответа

Решение

Вам нужно переориентировать rerender метод. Это должно работать:

const customRender = (node, options) => {
  const rendered = render(
    <ThemeProvider theme={Theme}>
      <MemoryRouter>{node}</MemoryRouter>
    </ThemeProvider>,
    options);

  return {
    ...rendered,
    rerender: (ui, options) =>
      customRender(ui, {container: rendered.container, ...options}),
    }
  };

Версия машинописного текста:

      function AppProvider({ children }: { children: React.ReactNode }) {
  return (
    <OtherProvider>
      <ThemeProvider theme={Theme}>
        <MemoryRouter>{children}</MemoryRouter>
      </ThemeProvider>,
    </OtherProvider>
  );
}

function renderInProvider(
  ui: ReactElement,
  options?: Omit<RenderOptions, "wrapper">
) {
  return render(<AppProvider>{ui}</AppProvider>, options);
}
Другие вопросы по тегам