Владислав Калачев

Тестирование роутов в React

44

Когда мы разрабатываем приложения на React, рутинной, но важной задачей является тестирование. Один из ключевых элементов любого веб-приложения — это маршрутизация (роутинг), которая позволяет пользователям перемещаться между различными страницами. Тестирование роутов помогает убедиться, что переходы между страницами работают корректно, ссылки ведут в нужные места, а компоненты рендерятся в зависимости от URL.

В этой статье я расскажу о своем опыте тестирования роутов в React, объясню, как настроить тесты, и какие инструменты для этого использовать.

Почему важно тестировать роуты?

Роутинг — это основа любого SPA (single-page application), и его корректная работа напрямую влияет на пользовательский опыт. Если роуты работают некорректно, пользователи могут столкнуться с такими проблемами, как:

— Переход по неверным URL.

— Ошибки при обновлении страницы.

— Неверная отрисовка компонентов при изменении маршрута.

Тестирование роутов помогает убедиться, что приложение работает так, как задумано, даже при изменении URL и навигации через разные части интерфейса.

Инструменты для тестирования роутов в React

Для тестирования роутов я использую следующие инструменты:

Jest: для написания и выполнения тестов.

React Testing Library: для рендеринга компонентов в тестовой среде.

— React Router: библиотека, которая используется для маршрутизации в React-приложениях. Для тестирования роутов можно использовать его компоненты и утилиты.

Установка необходимых зависимостей

Если у тебя еще не установлены эти библиотеки, начнем с установки необходимых инструментов:

npm install --save-dev jest @testing-library/react @testing-library/jest-dom react-router-dom

Теперь у нас есть все, что нужно для тестирования компонентов с роутингом.

Пример приложения с маршрутизацией

Представим, что у нас есть простое приложение с несколькими страницами: домашняя страница и страница о нас. В приложении используется React Router для маршрутизации между этими страницами.

import React from 'react';
import { BrowserRouter as Router, Route, Routes, Link } from 'react-router-dom';

const Home = () => <h1>Home Page</h1>;
const About = () => <h1>About Us</h1>;

function App() {
  return (
    <Router>
      <nav>
        <Link to="/">Home</Link>
        <Link to="/about">About</Link>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Router>
  );
}

export default App;

В этом примере:

— Мы создаем маршруты для домашней страницы и страницы о компании.

— Ссылки навигации с помощью компонента Link позволяют пользователю перемещаться между страницами без перезагрузки.

Тестирование роутов

Теперь, когда у нас есть приложение с маршрутизацией, давай посмотрим, как тестировать роуты.

Тест 1: Рендеринг правильной страницы по умолчанию

Во-первых, убедимся, что при первом рендере приложения отображается домашняя страница, так как маршрут по умолчанию («/») должен вести именно туда.

import { render, screen } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

test('renders home page by default', () => {
  render(
    <BrowserRouter>
      <App />
    </BrowserRouter>
  );

  // Проверяем, что отобразился текст "Home Page"
  expect(screen.getByText(/Home Page/i)).toBeInTheDocument();
});

Что здесь происходит:

— Мы используем render из React Testing Library для отрисовки приложения в тестовом окружении.

BrowserRouter нужен для того, чтобы наше приложение знало о маршрутизации.

screen.getByText проверяет, что элемент с текстом «Home Page» отображается на экране, что означает, что загрузилась домашняя страница.

Тест 2: Тестирование переходов между страницами

Теперь давай проверим, что при клике на ссылку «About» мы попадаем на страницу о компании.

import { render, screen } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';
import userEvent from '@testing-library/user-event';
import App from './App';

test('navigates to the about page when link is clicked', () => {
  render(
    <BrowserRouter>
      <App />
    </BrowserRouter>
  );

  // Находим ссылку на страницу "About" и кликаем по ней
  const aboutLink = screen.getByText(/About/i);
  userEvent.click(aboutLink);

  // Проверяем, что после клика мы на странице "About Us"
  expect(screen.getByText(/About Us/i)).toBeInTheDocument();
});

Что здесь происходит:

— Мы находим ссылку «About» с помощью screen.getByText и используем userEvent.click, чтобы симулировать клик по ней.

— Затем проверяем, что после клика на экране появился текст «About Us», что подтверждает успешный переход на нужную страницу.

Тест 3: Проверка отсутствующего маршрута (страница 404)

Важно также протестировать поведение приложения на неизвестных маршрутах. Добавим в наше приложение компонент для обработки 404 ошибки и протестируем его.

Обновим компонент App, добавив обработку несуществующих маршрутов:

function NotFound() {
  return <h1>404 Page Not Found</h1>;
}

function App() {
  return (
    <Router>
      <nav>
        <Link to="/">Home</Link>
        <Link to="/about">About</Link>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="*" element={<NotFound />} />  {/* Обработка несуществующих маршрутов */}
      </Routes>
    </Router>
  );
}

Теперь добавим тест:

test('renders 404 page for unknown route', () => {
  const badRoute = '/some/bad/route';

  render(
    <BrowserRouter>
      <App />
    </BrowserRouter>
  );

  // Переходим по несуществующему маршруту
  window.history.pushState({}, 'Test page', badRoute);

  // Проверяем, что отображается сообщение об ошибке 404
  expect(screen.getByText(/404 Page Not Found/i)).toBeInTheDocument();
});

Что здесь происходит:

— Мы вручную изменяем URL с помощью window.history.pushState() на несуществующий маршрут.

— Проверяем, что отобразился компонент NotFound с текстом «404 Page Not Found», что указывает на корректную обработку ошибки.

Заключение

Тестирование роутов в React — важный шаг для обеспечения стабильности работы вашего приложения. С помощью Jest и React Testing Library можно легко тестировать корректное рендеринг страниц, переходы между ними, а также обработку несуществующих маршрутов. Эти тесты помогут предотвратить ошибки на этапе разработки и улучшат общий пользовательский опыт.

Теперь ты знаешь, как эффективно тестировать роуты в React. Если у тебя в приложении есть сложная маршрутизация, не игнорируй тестирование — оно обеспечит уверенность в том, что навигация работает, как задумано.

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *