Тестирование компонентов, которые содержат дочерние элементы (children), может быть выполнено с использованием библиотеки React Testing Library. Эта библиотека предоставляет мощные инструменты для тестирования компонентов, включая дочерние элементы.

Основные методы для тестирования дочерних элементов:

  1. findBy*: Методы для поиска элементов по различным критериям (например, findByTestIdfindByTextfindByRole).
  2. getBy*: Методы для поиска элементов, которые должны присутствовать в DOM.
  3. queryBy*: Методы для поиска элементов, которые могут отсутствовать в DOM.

Предположим, у вас есть компонент Wrapper, который принимает дочерние элементы и отображает их внутри себя.

Компонент Wrapper.js:

import React from "react";
 
const Wrapper = ({ children }) => {
  return <div data-testid="wrapper">{children}</div>;
};
 
export default Wrapper;

Компонент App.js:

import React from "react";
import Wrapper from "./Wrapper";
 
const App = () => {
  return (
    <Wrapper>
      <div data-testid="child">Child Component</div>
    </Wrapper>
  );
};
 
export default App;

Тестовый файл App.test.js:

import { render, screen } from "@testing-library/react";
import App from "./App";
 
test("renders Wrapper with child component", () => {
  render(<App />);
 
  // Проверка наличия Wrapper
  const wrapperElement = screen.getByTestId("wrapper");
  expect(wrapperElement).toBeInTheDocument();
 
  // Проверка наличия дочернего компонента
  const childElement = screen.getByTestId("child");
  expect(childElement).toBeInTheDocument();
  expect(childElement).toHaveTextContent("Child Component");
});

Тестирование компонентов с динамическими дочерними элементами:

Если у вас есть компонент, который динамически создает дочерние элементы, вы можете использовать методы findBy* для асинхронного поиска элементов.

Компонент DynamicWrapper.js:

import React, { useState, useEffect } from "react";
 
const DynamicWrapper = ({ children }) => {
  const [isLoaded, setIsLoaded] = useState(false);
 
  useEffect(() => {
    setTimeout(() => {
      setIsLoaded(true);
    }, 1000);
  }, []);
 
  return <div data-testid="dynamic-wrapper">{isLoaded && children}</div>;
};
 
export default DynamicWrapper;

Тестовый файл DynamicWrapper.test.js:

import { render, screen, waitFor } from "@testing-library/react";
import DynamicWrapper from "./DynamicWrapper";
 
test("renders DynamicWrapper with child component after loading", async () => {
  render(
    <DynamicWrapper>
      <div data-testid="dynamic-child">Dynamic Child Component</div>
    </DynamicWrapper>,
  );
 
  // Проверка наличия DynamicWrapper
  const wrapperElement = screen.getByTestId("dynamic-wrapper");
  expect(wrapperElement).toBeInTheDocument();
 
  // Проверка наличия дочернего компонента после загрузки
  await waitFor(() => {
    const childElement = screen.getByTestId("dynamic-child");
    expect(childElement).toBeInTheDocument();
    expect(childElement).toHaveTextContent("Dynamic Child Component");
  });
});

Назад