Введение
При тестировании компонентов React, которые тесно связаны с маршрутизацией, вы можете столкнуться с ошибками, связанными с компонентами, специфичными для маршрутизатора, например <Link>
. Эти ошибки часто возникают из-за того, что такие компоненты ожидают визуализации в контексте маршрутизации, предоставляемом такими компонентами, как Router
или BrowserRouter
. В этой статье описывается, как обрабатывать эти ошибки маршрутизатора во время внешнего тестирования.
Проблема
Предположим, у вас есть компонент, который использует <Link>
для перехода к другому маршруту:
import { Link } from 'react-router-dom'; const MyComponent = () => { return ( <div> <Link to="/about">About</Link> </div> ); };
Если вы попытаетесь отобразить MyComponent
напрямую с помощью функции render()
библиотеки тестирования React, вы, скорее всего, увидите сообщение об ошибке. Это связано с тем, что компонент <Link>
ожидает отображения внутри компонента маршрутизатора, который обеспечивает необходимый контекст маршрутизации.
Решения
1. Обернуть компонент в маршрутизатор
Самый простой способ решить эту проблему — обернуть компонент маршрутизатором во время тестирования.
import { render } from '@testing-library/react'; import { BrowserRouter } from 'react-router-dom'; import MyComponent from './MyComponent'; it('renders without crashing', () => { render( <BrowserRouter> <MyComponent /> </BrowserRouter> ); });
2. Пользовательская функция рендеринга
Чтобы избежать повторяющегося кода, вы можете создать специальную функцию render
, которая автоматически помещает компоненты в маршрутизатор.
import { render as rtlRender } from '@testing-library/react'; import { BrowserRouter } from 'react-router-dom'; function render(ui, options) { return rtlRender(ui, { wrapper: BrowserRouter, ...options }); } // Usage it('renders without crashing', () => { render(<MyComponent />); });
3. Глобальная настройка
Альтернативно вы можете установить глобальную оболочку для всех ваших тестов, настроив настройки теста. Это полезно, если почти все ваши компоненты полагаются на контекст маршрутизатора.
import '@testing-library/jest-dom'; import { render as rtlRender } from '@testing-library/react'; import { BrowserRouter } from 'react-router-dom'; const AllTheProviders = ({ children }) => { return <BrowserRouter>{children}</BrowserRouter>; }; const customRender = (ui, options) => rtlRender(ui, { wrapper: AllTheProviders, ...options }); export * from '@testing-library/react'; export { customRender as render };
Заключение
Ошибки маршрутизатора во время внешнего тестирования обычно возникают из-за того, что некоторые компоненты ожидают контекст маршрутизации, который не предоставляется во время теста. Решения, как правило, просты: оберните компонент необходимым контекстом маршрутизатора индивидуально или глобально. Эти подходы гарантируют, что ваши компоненты имеют необходимые настройки для успешного выполнения во время тестов.