Miguel Amaya Camacho
Ingeniero Informático. Socio fundador de Tallanix S.A.C y de Xprende Tech. Activista del Software Libre y miembro fundador de la Comunidad Piurana de Software Libre VICUX y de la Comunidad de Programadores Python Piura.
Ing. José Miguel Amaya Camacho
miguel.amaya99@gmail.com
React es una biblioteca de JavaScript.
No es un framework.
Es un proyecto Open Source creado por Facebook.
Se usa para construir interfaces de usuario (UI) en el front-end.
React es la capa de vista de una aplicación MVC (Model View Controller)
npx create-react-app react-tutorial
Casi todo en React consta de componentes, que pueden ser componentes de clase o componentes simples.
La mayoría de las aplicaciones React tienen muchos componentes pequeños, y todo se carga en el componente principal de la aplicación.
Los componentes también suelen tener su propio archivo, así que cambiemos nuestro proyecto para hacerlo.
Basado en DOM Testing Library, es una solución muy liviana para probar componentes de React.
Proporciona funciones de utilidad ligera además de react-dom y react-dom/test-utils.
En lugar de tratar con instancias de componentes React renderizados, las pruebas funcionarán con nodos DOM reales.
Las utilidades que proporciona facilitan la consulta del DOM de la misma manera que lo haría el usuario.
Encontrar elementos de formulario por su texto de etiqueta.
Encontrar enlaces y botones a partir de su texto.
También expone una forma recomendada de encontrar elementos por un data-testid para elementos donde el contenido del texto y la etiqueta no tienen sentido o no son prácticos.
Un test runner o framework.
Específico para un framework de pruebas (se recomienda Jest pero funciona con cualquier otro).
Renderizar en un contenedor que se adjunta a document.body.
import {render} from '@testing-library/react'
test('renders a message', () => {
const {asFragment, getByText} = render(<Greeting />)
expect(getByText('Hello, world!')).toBeInTheDocument()
expect(asFragment()).toMatchInlineSnapshot(`
<h1>Hello, World!</h1>
`)
})
A menudo no se necesitarán, pero en caso sea necesario, estas son las opciones disponibles:
container
baseElement
hydrate
legacyRoot
wrapper
queries
El método render devuelve un objeto que tiene algunas propiedades:
queries
container
baseElement
debug
rerender
unmount
asFragment
Las queries de DOM Testing Library se devuelven automáticamente con su primer argumento vinculado a baseElement, que por defecto es document.body.
const {getByLabelText, queryAllByTestId} = render(<Component />)
Pero por lo general, se usa screen para acceder a las queries.
El nodo DOM container del React Element renderizado. es un div.
Este es un nodo DOM normal, por lo que se puede llamar a container.querySelector para inspeccionar los elementos secundarios.
Pero debemos evitar usar "containers" para consultar elementos.
Es el nodo DOM contenedor donde el React Element está renderizado. Si no se especifica el baseElement en las opciones, se establecerá de forma predeterminada en document.body.
Esto es útil cuando el componente que desea probar representa algo fuera del div del contenedor: cuando desee realizar una prueba instantánea del componente de su portal que representa su HTML directamente en el cuerpo.
Este método es un atajo para :
console.log(prettyDOM(baseElement)).
Pero se recomienda usar screen.debug en su lugar.
import React from 'react'
import {render} from '@testing-library/react'
const HelloWorld = () => <h1>Hello World</h1>
const {debug} = render(<HelloWorld />)
debug()
Esta función se usa para actualizar las propiedades del componente renderizado.
import {render} from '@testing-library/react'
const {rerender} = render(<NumberDisplay number={1} />)
// re-render the same component with different props
rerender(<NumberDisplay number={2} />)
Esto hará que el componente renderizado se desmonte.
Es útil para probar lo que sucede cuando su componente se elimina de la página.
Es una abstracción bastante pequeña sobre ReactDOM.unmountComponentAtNode
import {render} from '@testing-library/react'
const {container, unmount} = render(<Login />)
unmount()
Retorna un DocumentFragment del componente renderizado. Es útil si se necesita ver cómo reacciona el componente a los eventos.
import React, {useState} from 'react'
import {render, fireEvent} from '@testing-library/react'
const TestComponent = () => {
const [count, setCounter] = useState(0)
return (
<button onClick={() => setCounter(count => count + 1)}>
Click to increase: {count}
</button>
)
}
const {getByText, asFragment} = render(<TestComponent />)
const firstRender = asFragment()
fireEvent.click(getByText(/Click to increase/))
expect(firstRender).toMatchDiffSnapshot(asFragment())
Desmonta los árboles React que se montaron con render.
Esto se hace automáticamente si el test framework usado es compatible con afterEach global y se inyecta en su entorno de prueba (como mocha, Jest y Jasmine). De lo contrario, se deben realizar limpiezas manuales después de cada prueba.
.
Es un wrapper ligero alrededor de la función act de react-dom/test-utils.
Todo lo que hace es reenviar todos los argumentos a la función act si su versión de react admite act.
Se recomienda usar la importación de @testing-library/react sobre react-dom/test-utils por razones de consistencia.
Es un wrapper alrededor de render con un componente de prueba personalizado.
Pero se debe usar render, ya que un componente de prueba personalizado da como resultado pruebas más legibles y sólidas, ya que lo que desea probar no está oculto detrás de una abstracción..
import {renderHook} from '@testing-library/react'
test('returns logged in user', () => {
const {result} = renderHook(() => useLoggedInUser())
expect(result.current).toEqual({name: 'Alice'})
})
Sirven para encontrar elementos en la página.
Hay varios tipos de consultas ("get", "find", "query"); la diferencia entre ellos es si la consulta arrojará un error si no se encuentra ningún elemento o si devolverá una Promesa y volverá a intentarlo.
Según el contenido de la página que se esté seleccionando, diferentes consultas pueden ser más o menos apropiadas.
Elementos individuales
getBy...
queryBy...
findBy...
Elementos múltiples
getAllBy...
queryAllBy...
findAllBy...
getBy...: Devuelve el nodo coincidente para una consulta y genera un error descriptivo si ningún elemento coincide o si se encuentra más de una coincidencia (use getAllBy en su lugar si se espera más de un elemento).
queryBy...: Devuelve el nodo coincidente para una consulta y devuelve nulo si ningún elemento coincide. Esto es útil para afirmar un elemento que no está presente. Lanza un error si se encuentra más de una coincidencia (use queryAllBy en su lugar si está bien).
findBy...: Devuelve una Promesa que se resuelve cuando se encuentra un elemento que coincide con la consulta dada. La promesa se rechaza si no se encuentra ningún elemento o si se encuentra más de un elemento después de un tiempo de espera predeterminado de 1000 ms. Si necesita encontrar más de un elemento, use findAllBy..
getAllBy...: Devuelve una matriz de todos los nodos coincidentes para una consulta y arroja un error si no coincide ningún elemento.
queryAllBy...: Devuelve una matriz de todos los nodos coincidentes para una consulta y devuelve una matriz vacía ([]) si ningún elemento coincide.
findAllBy...: Devuelve una promesa que se resuelve en una matriz de elementos cuando se encuentran elementos que coinciden con la consulta dada. La promesa se rechaza si no se encuentran elementos después de un tiempo de espera predeterminado de 1000 ms.
Las pruebas debe parecerse a como los usuarios interactúan con la app. Por lo que es recomendable este orden de prioridad:
Consultas accesibles para todos: reflejan la experiencia de usuarios visuales/ratón, así como de aquellos que usan tecnología de asistencia.
Consultas semánticas: Selectores compatibles con HTML5 y ARIA. La experiencia del usuario al interactuar con estos atributos varía mucho entre los navegadores y la tecnología de asistencia.
Test IDs
Preguntas
By Miguel Amaya Camacho
Aprendiendo a usar React
Ingeniero Informático. Socio fundador de Tallanix S.A.C y de Xprende Tech. Activista del Software Libre y miembro fundador de la Comunidad Piurana de Software Libre VICUX y de la Comunidad de Programadores Python Piura.