Testing Library
¿Qué es Testing library?
Esta librería de test está pensada sobretodo para comprobar el comportamiento de ciertos elementos en tu web. No es un framework de testing, es una herramienta para suplementar un framework de testing (Ellos mismos recomiendan usar Jest pero funciona con cualquier framework).
Para ello nos proporciona diferentes comandos que podríamos dividir en DOM testing library y React testing library (Nos centraremos en la primera ya que la segunda está construida sobre la primera y simplemente añade unas funcionalidades extra para trabajar de manera más cómoda con React):
DOM testing library
Esta sección es común en todos los frameworks ya que hace referencia al código HTML que forma nuestra página. Con ella podemos testear de muchas maneras el comportamiento esperado de ciertas etiquetas o eventos. Según la documentación oficial, es una solución muy ligera que te permite testear nodos del DOM ya que funciona de una manera muy similar a cuando un usuario navega por los diferentes elementos de la web. En esta entrada me voy a centrar sobre todo en las Queries y en el FireEvent.
Vamos a crearnos un proyecto en React para testear las diferentes queries que nos proporciona la librería.
Creamos el proyecto
Accedemos a la carpeta y lo arrancamos para ver si todo funciona bien
Vemos como de base tiene estas dependencias instaladas
npm install --save-dev @testing-library/dom
FireEvent
De cierto modo, FireEvent simplemente permite simular el comportamiento de un evento en JS como hacer click en un botón, pulsar una tecla o pasar el ratón por encima de un elemento.
Dado un botón simple en React, podemos hacer un test simple para ver si se le puede hacer click:
Click
Simula un click en el elemento que le indiquemos
|
|
Dado por ejemplo otro botón podemos testear si ha sido llamado o no:
|
|
Como puedes ver, hay muchas maneras de realizar un test en función de lo que te interese testear. En estos casos probamos botones porque son muy sencillos de entender, pero también podemos hacerlo con enlaces o con elementos simples de tus componentes. Lo importante es renderizar tu componente, buscar por texto, por rol,…etc. y disparar el evento que quieras (simulando el comportamiento de un usuario en la web)
Change
simula un cambio en el elemento que le digamos, por ejemplo escribir una palabra o pulsar una tecla
|
|
Poco a poco fireEvent está siendo sustituido por userEvent, pero de eso hablaré más adelante, por ahora nos hemos centrado en conocer el origen de lo que nos ofrece la librería.
Queries
¿Cuál debería usar?
Existe una lista oficial de prioridad sobre qué debería utilizar para cada elemento de la web. Aquí se diferencia porque hay algunas queries que son mejores para formularios, otras para etiquetas planas,…
- Queries accesibles a todo el mundo
getByRole
Está pensado sobre todo para acceder a cualquier elemento dentro del árbol de accesibilidad del DOM. Ésta etiqueta debería ser tu primera opción casi siempre que quieras buscar algo ya que tu web debería cumplir los roles ARIA.
|
|
getByLabelText
Especialmente útil para formularios
|
|
getByPlaceholderText
No deberías utilizar este antes que getByLabelText, pero si no te queda otro remedio está la opción de buscar por el placeholder.
|
|
getByText
Súper útil e interesante para usarlos en elementos no interactivos como divs y spans
|
|
getByDisplayValue
Otra etiqueta útil para formularios. Viene bien sobre todo para comprobar si un valor está bien introducido o no.
|
|
Queries semánticas
getByAltText
Si ninguna de las anteriores te convence, puedes buscar aquellos elementos que contengan los atributos alt, como las imagenes, area o input.
|
|
getByTitle
También se puede buscar por el title de la etiqueta aunque no es visible para los usuarios, por lo que ya vemos como nos vamos acercando a aquello que no deberíamos utilizar a menudo.
|
|
getByTestId
Úsalo como último remedio, no modifiques tus componentes para añadirles IDs innecesariamente para que pasen el test.
|
|
" " Conclusiones
Hay mil maneras que he descubierto de hacer test mientras realizaba la entrada al blog. Los ejemplos que he puesto son simples pero la cosa se puede complicar mucho añadiendo más expects y más lógica interna con fireEvent y demás herramientas que nos proporciona React-Testing-Library.
Sin duda es una herramienta muy potente pero que requiere que le eches un buen vistazo a la documentación antes de ponerte a crear tests.