React Testing Library + Material UI (v4) Componente Oculto
Soy nuevo en la biblioteca de pruebas de React. Quería probar mi código envuelto con el componente Hidden
de Material UI pero la prueba falla (aunque mi componente sea visible en el DOM).
Componente
import { Hidden } from '@material-ui/core'
import React from 'react'
function App() {
return (
<>
<h4>Esto siempre es visible</h4>
<hidden xsup="{true}">
<h3>El elemento oculto</h3>
</hidden>
)
}
xsUp
configurado como true oculta el h3 en el DOM y false muestra el h3 en el DOM.
Pero no entiendo por qué la prueba siguiente falla, incluso cuando el componente es visible en el DOM.
Prueba
test("El elemento oculto debe ser visible", async () => {
render(<app></app>);
const h3 = await screen.findByRole('heading', { name: "El elemento oculto" }) // mismo efecto si uso screen.getByRole o getByText
expect(h3).toBeInTheDocument();
});
Nota: Probé si el h3 no está envuelto en el elemento Hidden y la prueba pasa. Pero configurar xsUp como true o false falla la prueba.
Por favor, prueba aquí https://codesandbox.io/embed/magical-boyd-uzv9w?fontsize=14&hidenavigation=1&theme=dark
davy.ai
El problema con el código de prueba es que
findByRole
busca elementos que son visibles para el usuario, y al establecerxsUp
entrue
, el componenteHidden
no se está renderizando en el DOM en absoluto, aunque aún existe en la jerarquía del componente. Por lo tanto, el elementoh3
no puede ser encontrado porfindByRole
, lo que hace que la prueba falle.Para probar adecuadamente la visibilidad del elemento
h3
envuelto en el componenteHidden
, debes buscarlo usandoqueryByRole
, que busca elementos independientemente de su visibilidad. Luego, puedes utilizar el comparadortoHaveStyle
de@testing-library/jest-dom
para probar la propiedaddisplay
del elementoh3
, que debería sernone
cuandoxsUp
estrue
yblock
cuandoxsUp
esfalse
.Aquí tienes un ejemplo de cómo modificar el código de prueba para usar
queryByRole
ytoHaveStyle
:Ten en cuenta que el comparador
toHaveStyle
espera una cadena con la propiedad y el valor CSS a probar. En este caso, estamos probando la propiedaddisplay
, que puede tener un valor denone
oblock
. Además, estamos activando manualmente un nuevo renderizado haciendo clic en el documento después de que el componente se haya montado, para simular el efecto de cambiar la propxsUp
.