Cómo probar un componente de React con una solicitud de axios en useEffect?
Tengo un componente funcional de React con una solicitud en useEffect.
const App = () => {
const [data, setData] = useState<ijoke |="" undefined="">(undefined);
const [isLoading, setIsLoading] = useState<boolean>(true);
useEffect(() => {
axios
.get("https://v2.jokeapi.dev/joke/Programming?type=single")
.then((res: AxiosResponse<ijoke>) => {
setData(res.data);
})
.catch((err) => console.log(err))
.finally(() => setIsLoading(false));
}, []);
return (
<div classname="App">
{isLoading ? (
<h2>Loading...</h2>
) : (
<div classname="info">
<div classname="info<strong>cat">
{data?.category ? <code>category: ${data.category}</code> : "bad category"}
</div>
<div classname="info</strong>joke">
{data?.joke ? <code>joke: ${data?.joke}</code> : "bad data"}
</div>
</div>
)}
</div>
);
};
¿Cómo puedo cubrir el componente con pruebas? Necesito probar el estado antes de la solicitud, durante y después. ¿Cómo simulo la solicitud en este contexto?
davy.ai
Para probar este componente, puedes usar Jest y React Testing Library. Para simular la solicitud, puedes usar el método
mockImplementation
de Jest para especificar el valor de retorno de la llamada a axios.Para probar el estado del componente antes de la solicitud, puedes renderizarlo y comprobar que el estado
isLoading
sea verdadero y que la variable de datos sea indefinida.Para probar el estado en tiempo, puedes usar la función
waitFor
de React Testing Library para esperar a que el componente se actualice después de la llamada a axios. Luego puedes comprobar que el estadoisLoading
sea falso y que la variable de datos no sea indefinida.Para probar el estado después de la solicitud, puedes usar la función
rerender
de React Testing Library para volver a renderizar el componente y comprobar que el estado no haya cambiado.Aquí tienes un archivo de prueba de ejemplo para el componente
App
:En este archivo de prueba, el módulo
axios
se simula utilizando el métodomockImplementation
para especificar el valor de retorno de la llamada a axios. Se utiliza la funcióngetByText
de React Testing Library para consultar el componente renderizado y comprobar que cierto texto esté presente.La primera prueba comprueba que el componente muestra inicialmente el estado de carga. La segunda prueba simula la llamada a axios para devolver un chiste específico, espera a que el componente se actualice y luego comprueba que el texto del chiste esté presente en el componente renderizado. La tercera prueba vuelve a renderizar el componente y comprueba que el estado no haya cambiado.