Мокирование маршрутизации — это процесс имитации поведения маршрутизатора без фактической привязки к реальному 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 является универсальным инструментом для разработки и тестирования приложений, где важно быстро и безопасно проверять логику маршрутов, редиректы, асинхронные действия и обработку ошибок без необходимости интеграции с реальной инфраструктурой.