Тестирование компонентов, которые содержат дочерние элементы (children), может быть выполнено с использованием библиотеки React Testing Library. Эта библиотека предоставляет мощные инструменты для тестирования компонентов, включая дочерние элементы.
Основные методы для тестирования дочерних элементов:
findBy*: Методы для поиска элементов по различным критериям (например,findByTestId,findByText,findByRole).getBy*: Методы для поиска элементов, которые должны присутствовать в DOM.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");
});
});