Пагинация — ключевая составляющая в пользовательских интерфейсах, позволяющая эффективно управлять большим объёмом данных, разбивая их на страницы. В контексте тестирования React-приложений, пагинация требует особого внимания, поскольку её поведение часто зависит от состояния и взаимодействия с пользователем. Тестирование компонентов пагинации с использованием React Testing Library позволяет гарантировать правильную работу интерфейса и обработку событий.
Типичный компонент пагинации состоит из набора элементов управления, таких как кнопки для перехода на следующую или предыдущую страницу, индикаторы текущей страницы и ссылки на конкретные страницы. Например:
import React from 'react';
const Pagination = ({ currentPage, totalPages, onPageChange }) => {
return (
<div>
<button
onCl ick={() => onPageChange(currentPage - 1)}
disabled={currentPage === 1}>
Prev
</button>
<span>Page {currentPage} of {totalPages}</span>
<button
onCl ick={() => onPageChange(currentPage + 1)}
disabled={currentPage === totalPages}>
Next
</button>
</div>
);
};
export default Pagination;
Здесь компонент принимает три пропса:
currentPage — текущая страница.totalPages — общее количество страниц.onPageChange — функция, вызываемая при изменении
страницы.Тестирование компонента пагинации в React требует внимания к следующим аспектам:
Первый шаг — проверить, что компонент корректно отображает текущую
страницу и общее количество страниц. Для этого можно использовать
getByText или getByRole, чтобы убедиться, что
отображаемая информация соответствует переданным пропсам.
Пример теста:
import { render, screen } from '@testing-library/react';
import Pagination from './Pagination';
test('отображает правильный номер текущей страницы и общее количество страниц', () => {
render(<Pagination currentPage={1} totalPages={5} onPageCha nge={() => {}} />);
expect(screen.getByText(/Page 1 of 5/i)).toBeInTheDocument();
});
В этом тесте проверяется, что компонент отображает текст “Page 1 of
5”, что подтверждает правильную работу компонента при передаче пропсов
currentPage и totalPages.
Следующий шаг — тестирование логики кнопок “Prev” и “Next”. Эти кнопки должны быть деактивированы, если пользователь находится на первой или последней странице, соответственно.
Пример теста:
test('кнопка "Prev" деактивируется на первой странице', () => {
render(<Pagination currentPage={1} totalPages={5} onPageCha nge={() => {}} />);
const prevButton = screen.getByText(/Prev/i);
expect(prevButton).toBeDisabled();
});
test('кнопка "Next" деактивируется на последней странице', () => {
render(<Pagination currentPage={5} totalPages={5} onPageCha nge={() => {}} />);
const nextButton = screen.getByText(/Next/i);
expect(nextButton).toBeDisabled();
});
Здесь проверяется, что на первой странице кнопка “Prev”
деактивирована, а на последней — кнопка “Next”. Для этого используется
метод toBeDisabled(), который проверяет, что элемент
недоступен для взаимодействия.
Необходимо также убедиться, что при клике на кнопки “Prev” или “Next”
вызывается переданная функция onPageChange с правильным
аргументом. В этом случае можно использовать jest mock-функции для
отслеживания вызовов.
Пример теста:
test('вызывает onPageChange с правильным значением при клике на "Next"', () => {
const onPageCha nge = jest.fn();
render(<Pagination currentPage={1} totalPages={5} onPageCha nge={onPageChange} />);
const nextButton = screen.getByText(/Next/i);
nextButton.click();
expect(onPageChange).toHaveBeenCalledWith(2);
});
В этом тесте проверяется, что при клике на кнопку “Next” вызывается
функция onPageChange с аргументом, равным следующей
странице.
React Testing Library предоставляет инструменты для симуляции
пользовательских взаимодействий, такие как fireEvent. Для
более сложных тестов можно использовать fireEvent для
эмуляции кликов и других действий.
Пример использования fireEvent:
import { fireEvent, render, screen } from '@testing-library/react';
import Pagination from './Pagination';
test('кнопка "Next" работает при клике', () => {
const onPageCha nge = jest.fn();
render(<Pagination currentPage={1} totalPages={5} onPageCha nge={onPageChange} />);
const nextButton = screen.getByText(/Next/i);
fireEvent.click(nextButton);
expect(onPageChange).toHaveBeenCalledWith(2);
});
Здесь используется fireEvent.click(), чтобы
смоделировать клик по кнопке “Next” и проверить, что функция
onPageChange была вызвана с правильным аргументом.
Когда количество страниц и элементов на странице становится большим, важно тестировать производительность компонента пагинации. Хотя React Testing Library в первую очередь ориентирована на тестирование функциональности, можно также удостовериться, что пагинация правильно отображается и работает с большим количеством данных.
Для этого можно тестировать сценарии с большими пропсами:
test('работает с большим количеством страниц', () => {
const onPageCha nge = jest.fn();
render(<Pagination currentPage={1} totalPages={1000} onPageCha nge={onPageChange} />);
const nextButton = screen.getByText(/Next/i);
fireEvent.click(nextButton);
expect(onPageChange).toHaveBeenCalledWith(2);
});
Здесь тестируется работа пагинации с 1000 страниц, чтобы убедиться, что компонент корректно обрабатывает большие данные и не вызывает ошибок.
При тестировании пагинации важно учитывать реальные пользовательские сценарии, такие как:
Такие тесты позволяют гарантировать, что компонент будет вести себя ожидаемым образом в реальных условиях эксплуатации.
Тестирование пагинации в React с использованием React Testing Library требует комплексного подхода, включая проверку отображения данных, правильности взаимодействия с пользователем и функциональности кнопок. С помощью инструментов библиотеки можно легко симулировать клики, проверять состояния элементов и убедиться в правильности работы логики компонента, что является неотъемлемой частью обеспечения качества в React-приложениях.