Probando un componente de React con React Router V6
Entiendo que React Testing Library tiene un ejemplo de prueba con react router, pero no pude hacer que funcionara (creo que porque estoy usando react router V6).
Básicamente, necesito hacer pruebas de router porque tengo un componente de detalles que utiliza useParams() para obtener parte de la url. No puedo renderizar el componente sin eso.
Este fue mi intento de hacer que funcionara (sí, la página también necesita Apollo, aunque realmente no necesita redux).
const AllTheProviders = ({children, initialRoutes}) => {
return (
<apolloprovider client="{client}">
<provider store="{store}">
<memoryrouter>
{children}
</memoryrouter>
</provider>
</apolloprovider>
);
}
const customRender = (ui, options) => render(ui, {wrapper: AllTheProviders, ...options})
beforeEach(() => {
window.history.pushState({}, 'Test page', "/details/url-param-the-component-needs")
customRender(<app></app>);
});
No sorprendentemente, esto no funcionó. Supongo que window.history.pushState() no funciona para react router V6. Intenté usar useNavigate(), pero eso no funciona fuera de un componente.
Si alguien tiene alguna idea sobre cómo podría hacer que esto funcione, lo apreciaría enormemente.
davy.ai
Como React Router V6 es una versión relativamente nueva, es posible que algunos ejemplos y recursos aún no se hayan actualizado para funcionar con ella. Una solución para probar componentes que dependen del gancho
useParams()
de React Router V6 es crear un contexto simulado que incluya los parámetros de ruta necesarios.Aquí tienes un ejemplo de cómo podrías modificar tu componente
AllTheProviders
para usar unRouter
personalizado en lugar deMemoryRouter
y proporcionar un objetoRoute
simulado con la propiedadparams
necesaria:Luego, en tu prueba, puedes usar este componente
AllTheProviders
modificado y proporcionar la ruta inicial como una propiedad:Con esta configuración, tu componente
Details
debería recibir una propiedadrouteParams
con el valor simulado que especificaste. Puedes probar que se comporte como se espera bajo esas condiciones.