API
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
React Testing Library reexporta todo de DOM Testing Library además de estos métodos:
render
function render(
ui: React.ReactElement<any>,
options?: {
/* You won't often use this, expand below for docs on options */
},
): RenderResult
Renderiza en un contenedor que se añade a document.body.
import {render} from '@testing-library/react'
render(<div />)
import {render} from '@testing-library/react'
import '@testing-library/jest-dom'
test('renders a message', () => {
const {asFragment, getByText} = render(<Greeting />)
expect(getByText('Hello, world!')).toBeInTheDocument()
expect(asFragment()).toMatchInlineSnapshot(`
<h1>Hello, World!</h1>
`)
})
Opciones de render
Normalmente no necesitarás especificar opciones, pero si alguna vez lo haces, estas son las opciones disponibles que puedes proporcionar como segundo argumento a render.
container
Por defecto, React Testing Library creará un div y agregará ese div al document.body, siendo este el lugar donde se renderizará tu componente React. Si proporcionas tu propio container HTMLElement mediante esta opción, no se agregará automáticamente al document.body.
Por ejemplo: Si estás probando un elemento tablebody, no puede ser hijo de un div. En este caso, puedes especificar una table como container de renderizado.
const table = document.createElement('table')
const {container} = render(<TableBody {...props} />, {
container: document.body.appendChild(table),
})
baseElement
Si se especifica container, este valor se toma por defecto. En caso contrario, el valor predeterminado es document.body. Se utiliza como elemento base para las consultas y también para lo que se imprime al usar debug().
hydrate
Si hydrate se establece en true, se renderizará con ReactDOM.hydrate. Esto puede ser útil si estás usando renderizado del lado del servidor y utilizas ReactDOM.hydrate para montar tus componentes.
legacyRoot
Esta opción solo está disponible cuando las pruebas se ejecutan con React 18 y versiones anteriores.
Por defecto renderizaremos con soporte para características concurrentes (es decir, ReactDOMClient.createRoot). Sin embargo, si estás trabajando con una aplicación heredada que requiere renderizado como en React 17 (es decir, ReactDOM.render), debes habilitar esta opción estableciendo legacyRoot: true.
onCaughtError
Callback invocado cuando React detecta un error en un Error Boundary.
Se comporta igual que onCaughtError en ReactDOMClient.createRoot.
onRecoverableError
Callback invocado cuando React se recupera automáticamente de errores.
Se comporta igual que onRecoverableError en ReactDOMClient.createRoot.
wrapper
Pasa un componente de React como opción wrapper para que se renderice alrededor del elemento interno. Esto es especialmente útil para crear funciones de renderizado personalizadas reutilizables para proveedores de datos comunes. Consulta configuración para ver ejemplos.
queries
Consultas a vincular. Sobrescribe el conjunto predeterminado de DOM Testing Library a menos que se fusionen.
// Example, a function to traverse table contents
import * as tableQueries from 'my-table-query-library'
import {queries} from '@testing-library/react'
const {getByRowColumn, getByText} = render(<MyTable />, {
queries: {...queries, ...tableQueries},
})
Consulta helpers para obtener orientación sobre cómo usar funciones de utilidad para crear consultas personalizadas.
Las consultas personalizadas también pueden agregarse globalmente siguiendo la guía de renderizado personalizado.
Opción reactStrictMode de render
Cuando está habilitado, se renderiza <StrictMode> alrededor del elemento interno. Si se define, sobrescribe el valor de reactStrictMode establecido en configure.
Resultado de render
El método render devuelve un objeto con varias propiedades:
...queries
La característica más importante de render es que las consultas de DOM Testing Library se devuelven automáticamente con su primer argumento vinculado al baseElement, que por defecto es document.body.
Consulta Queries para ver la lista completa.
Ejemplo
const {getByLabelText, queryAllByTestId} = render(<Component />)
container
El nodo DOM contenedor de tu elemento React renderizado (usando ReactDOM.render). Es un div. Este es un nodo DOM regular, por lo que puedes usar container.querySelector, etc., para inspeccionar los elementos hijos.
Consejo: Para obtener el elemento raíz de tu elemento renderizado, usa
container.firstChild.NOTA: Cuando ese elemento raíz es un Fragmento de React,
container.firstChildsolo obtendrá el primer hijo del Fragmento, no el Fragmento en sí.
🚨 ¡Si te encuentras usando
containerpara consultar elementos renderizados, deberías reconsiderarlo! Las otras consultas están diseñadas para ser más resistentes a los cambios que se harán en el componente que estás probando. Evita usarcontainerpara consultar elementos.
baseElement
El nodo DOM contenedor donde se renderiza tu elemento React. Si no especificas baseElement en las opciones de render, por defecto será document.body.
Esto es útil cuando el componente que deseas probar renderiza algo fuera del contenedor div, por ejemplo, cuando quieres hacer pruebas de instantáneas de tu componente portal que renderiza su HTML directamente en el body.
Nota: las consultas devueltas por
renderexaminan baseElement, por lo que puedes usar consultas para probar tu componente portal sin especificar baseElement.
debug
NOTA: Se recomienda usar
screen.debugen su lugar.
Este método es un atajo para console.log(prettyDOM(baseElement)).
import React from 'react'
import {render} from '@testing-library/react'
const HelloWorld = () => <h1>Hello World</h1>
const {debug} = render(<HelloWorld />)
debug()
// <div>
// <h1>Hello World</h1>
// </div>
// you can also pass an element: debug(getByTestId('messages'))
// and you can pass all the same arguments to debug as you can
// to prettyDOM:
// const maxLengthToPrint = 10000
// debug(getByTestId('messages'), maxLengthToPrint, {highlight: false})
Es un envoltorio simple alrededor de prettyDOM, que también está expuesto y proviene de DOM Testing Library.
rerender
Probablemente sería mejor probar el componente que actualiza las props para asegurarse de que se actualizan correctamente (consulta la sección de Principios Guía). Dicho esto, si prefieres actualizar las props de un componente renderizado en tu prueba, esta función puede usarse para actualizar props 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} />)
Consulta la página de ejemplos
unmount
Esto hará que el componente renderizado se desmonte. Es útil para probar qué sucede cuando tu componente se elimina de la página (como verificar que no dejas manejadores de eventos pendientes causando fugas de memoria).
Este método es una pequeña abstracción sobre
ReactDOM.unmountComponentAtNode
import {render} from '@testing-library/react'
const {container, unmount} = render(<Login />)
unmount()
// your component has been unmounted and now: container.innerHTML === ''
asFragment
Devuelve un DocumentFragment de tu componente renderizado. Esto puede ser útil si necesitas evitar enlaces en vivo y ver cómo reacciona tu componente a 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/))
// This will snapshot only the difference between the first render, and the
// state of the DOM after the click event.
// See https://github.com/jest-community/snapshot-diff
expect(firstRender).toMatchDiffSnapshot(asFragment())
cleanup
Desmonta árboles de React que fueron montados con render.
Esto se llama automáticamente si tu framework de pruebas (como Mocha, Jest o Jasmine) inyecta una función global
afterEach()en el entorno de pruebas. Si no es el caso, deberás llamar acleanup()después de cada prueba.
Por ejemplo, si estás usando el framework de pruebas ava,
necesitarás utilizar el hook test.afterEach de esta manera:
import {cleanup, render} from '@testing-library/react'
import test from 'ava'
test.afterEach(cleanup)
test('renders into document', () => {
render(<div />)
// ...
})
// ... more tests ...
No llamar a cleanup después de haber invocado render puede causar pérdidas de memoria
y pruebas que no son "idempotentes" (lo que puede generar errores difíciles de depurar en tus pruebas).
act
Este es un envoltorio ligero alrededor de la
función react act.
Simplemente reenvía todos los argumentos a la función act si tu versión de React la soporta.
Se recomienda importar desde @testing-library/react en lugar de react por consistencia.
renderHook
Es un envoltorio conveniente alrededor de render con un componente de prueba personalizado.
Esta API surgió de un patrón de pruebas popular y es principalmente útil para bibliotecas que publican hooks.
Se recomienda preferir render ya que un componente de prueba personalizado produce tests más legibles y robustos,
porque lo que quieres probar no está oculto tras una abstracción.
function renderHook<
Result,
Props,
Q extends Queries = typeof queries,
Container extends Element | DocumentFragment = HTMLElement,
BaseElement extends Element | DocumentFragment = Container
>(
render: (initialProps: Props) => Result,
options?: RenderHookOptions<Props, Q, Container, BaseElement>,
): RenderHookResult<Result, Props>
Ejemplo:
import {renderHook} from '@testing-library/react'
test('returns logged in user', () => {
const {result} = renderHook(() => useLoggedInUser())
expect(result.current).toEqual({name: 'Alice'})
})
Opciones de renderHook
renderHook Opciones initialProps
Define las props que se pasan al render-callback durante la primera invocación.
No se pasarán si llamas a rerender sin props.
import {renderHook} from '@testing-library/react'
test('returns logged in user', () => {
const {result, rerender} = renderHook((props = {}) => props, {
initialProps: {name: 'Alice'},
})
expect(result.current).toEqual({name: 'Alice'})
rerender()
expect(result.current).toEqual({name: undefined})
})
NOTA: Al usar
renderHookjunto con las opcioneswrappereinitialProps, losinitialPropsno se pasan al componentewrapper. Para proporcionar props al componentewrapper, considera una solución como esta:const createWrapper = (Wrapper, props) => {
return function CreatedWrapper({ children }) {
return <Wrapper {...props}>{children}</Wrapper>;
};
};
...
{
wrapper: createWrapper(Wrapper, { value: 'foo' }),
}
onCaughtError
Callback invocado cuando React detecta un error en un Error Boundary.
Se comporta igual que onCaughtError en ReactDOMClient.createRoot.
onRecoverableError
Callback invocado cuando React se recupera automáticamente de errores.
Se comporta igual que onRecoverableError en ReactDOMClient.createRoot.
renderHook Opciones wrapper
Ver opción wrapper para render
Opciones de renderHook reactStrictMode
Ver opción reactStrictMode para render
Resultado de renderHook
El método renderHook retorna un objeto con varias propiedades:
result
Contiene el valor más reciente confirmado devuelto por el render-callback:
import {renderHook} from '@testing-library/react'
const {result} = renderHook(() => {
const [name, setName] = useState('')
React.useEffect(() => {
setName('Alice')
}, [])
return name
})
expect(result.current).toBe('Alice')
Nota que el valor se almacena en result.current. Considera result como una
ref para el valor más reciente confirmado.
rerender
Vuelve a renderizar el render-callback previamente renderizado con nuevas props:
import {renderHook} from '@testing-library/react'
const {rerender} = renderHook(({name = 'Alice'} = {}) => name)
// re-render the same hook with different props
rerender({name: 'Bob'})
unmount
Desmonta el hook de prueba.
import {renderHook} from '@testing-library/react'
const {unmount} = renderHook(({name = 'Alice'} = {}) => name)
unmount()
configure
Modifica opciones globales. El uso básico puede verse en Opciones de Configuración.
React Testing Library también tiene opciones específicas.
import {configure} from '@testing-library/react'
configure({reactStrictMode: true})
Opciones de configure
reactStrictMode
Cuando está habilitado, <StrictMode> se renderiza alrededor del elemento interno. Por defecto es false.
Esta configuración puede cambiarse para una prueba individual proporcionando reactStrictMode en el argumento de opciones de la función render.