Мокирование маршрутизации

Мокирование маршрутизации — это процесс имитации поведения маршрутизатора без фактической привязки к реальному URL или серверу. В библиотеке Universal Router это позволяет тестировать логику маршрутов, обработчики, редиректы и асинхронные действия без необходимости поднимать полный стек приложения.


Создание маршрутов для мокирования

В Universal Router маршруты описываются в виде массива объектов с ключами path, action и опциональными children:

import UniversalRouter from 'universal-router';

const routes = [
  {
    path: '/home',
    action: () => 'Главная страница',
  },
  {
    path: '/profile/:id',
    action: ({ params }) => `Профиль пользователя ${params.id}`,
  },
  {
    path: '(.*)',
    action: () => 'Страница не найдена',
  },
];

const router = new UniversalRouter(routes);

Для мокирования достаточно использовать такие маршруты без подключения к реальному серверу или браузерному history API.


Использование resolve для тестирования

Метод router.resolve(path) возвращает результат работы маршрутизатора, что позволяет проверять корректность сопоставления маршрутов:

(async () => {
  console.log(await router.resolve('/home'));       // 'Главная страница'
  console.log(await router.resolve('/profile/42')); // 'Профиль пользователя 42'
  console.log(await router.resolve('/unknown'));    // 'Страница не найдена'
})();

Ключевой момент: resolve работает асинхронно, поэтому для моков удобно использовать async/await.


Мокирование параметров маршрута

Часто требуется проверять обработчики с динамическими параметрами. Universal Router автоматически передает их в action:

const mockPath = '/profile/99';
const result = await router.resolve(mockPath);
// result -> 'Профиль пользователя 99'

Можно создавать массив тестовых путей с разными параметрами, чтобы полностью покрыть логику маршрутов.


Асинхронные действия и мокирование данных

Маршруты Universal Router могут возвращать промисы, что позволяет имитировать загрузку данных с сервера:

const routes = [
  {
    path: '/posts/:id',
    async action({ params }) {
      const mockApiResponse = { id: params.id, title: 'Тестовая статья' };
      return mockApiResponse;
    },
  },
];

const router = new UniversalRouter(routes);
const post = await router.resolve('/posts/123');
console.log(post); // { id: '123', title: 'Тестовая статья' }

Использование моков позволяет полностью контролировать возвращаемые данные и проверять обработку различных сценариев без сетевых запросов.


Мокирование редиректов и ошибок

Для редиректов в Universal Router используют возврат объекта с ключом redirect:

const routes = [
  {
    path: '/login',
    action: () => ({ redirect: '/home' }),
  },
];

const router = new UniversalRouter(routes);
const result = await router.resolve('/login');

if (result.redirect) {
  console.log(`Редирект на ${result.redirect}`); // 'Редирект на /home'
}

Ошибки можно мокировать выбросом исключения внутри action:

const routes = [
  {
    path: '/error',
    action: () => { throw new Error('Тестовая ошибка'); },
  },
];

try {
  await router.resolve('/error');
} catch (e) {
  console.log(e.message); // 'Тестовая ошибка'
}

Это особенно полезно для unit-тестирования обработки ошибок маршрутов.


Мокирование вложенных маршрутов

Universal Router поддерживает вложенные маршруты через ключ children, что позволяет имитировать сложную структуру приложения:

const routes = [
  {
    path: '/dashboard',
    children: [
      { path: '/stats', action: () => 'Статистика' },
      { path: '/settings', action: () => 'Настройки' },
    ],
  },
];

const router = new UniversalRouter(routes);
console.log(await router.resolve('/dashboard/stats'));    // 'Статистика'
console.log(await router.resolve('/dashboard/settings')); // 'Настройки'

Моки вложенных маршрутов позволяют проверять корректность вложенной логики и приоритета сопоставления маршрутов.


Преимущества мокирования маршрутов

  • Тестируемость: можно полностью покрыть все маршруты без запуска браузера или сервера.
  • Изоляция: каждый маршрут проверяется отдельно, без побочных эффектов.
  • Контроль данных: легко подставлять тестовые ответы для асинхронных маршрутов.
  • Проверка ошибок и редиректов: имитация нестандартного поведения маршрутов.

Мокирование маршрутизации в Universal Router является универсальным инструментом для разработки и тестирования приложений, где важно быстро и безопасно проверять логику маршрутов, редиректы, асинхронные действия и обработку ошибок без необходимости интеграции с реальной инфраструктурой.