API
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
React Testing Library réexporte tous les éléments de DOM Testing Library ainsi
que ces méthodes :
Options de
renderRésultat de
renderOptions de
renderHookRésultat de
renderHookOptions de
configure
render
function render(
ui: React.ReactElement<any>,
options?: {
/* You won't often use this, expand below for docs on options */
},
): RenderResult
Effectue le rendu dans un conteneur ajouté à 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>
`)
})
Options de render
Vous n'aurez généralement pas besoin de spécifier d'options, mais si c'est le cas,
voici celles disponibles que vous pouvez passer en second argument à render.
container
Par défaut, React Testing Library crée une div et ajoute cette div au document.body. C'est là que votre composant React sera rendu. Si vous fournissez votre propre container HTMLElement via cette option, il ne sera pas automatiquement ajouté au document.body.
Par exemple : Si vous testez un élément tablebody, il ne peut pas être enfant d'un div. Dans ce cas, vous pouvez spécifier une table comme container de rendu.
const table = document.createElement('table')
const {container} = render(<TableBody {...props} />, {
container: document.body.appendChild(table),
})
baseElement
Si container est spécifié, cette valeur le remplace par défaut. Sinon, elle
vaut par défaut document.body. Cet élément sert de base pour les requêtes et
ce qui est affiché lors de l'utilisation de debug().
hydrate
Si hydrate est défini sur true, le rendu utilisera ReactDOM.hydrate. Utile si vous utilisez le rendu côté serveur et montez vos composants avec ReactDOM.hydrate.
legacyRoot
Cette option n'est disponible que pour les tests exécutés avec React 18 et antérieur.
Par défaut, nous effectuons le rendu avec le support des fonctionnalités concurrentes (c'est-à-dire ReactDOMClient.createRoot). Toutefois, si vous travaillez avec une application héritée nécessitant un rendu comme dans React 17 (c'est-à-dire ReactDOM.render), vous devez activer cette option en définissant legacyRoot: true.
onCaughtError
Fonction de rappel déclenchée quand React intercepte une erreur dans un périmètre d'erreur (Error Boundary).
Se comporte comme onCaughtError dans ReactDOMClient.createRoot.
onRecoverableError
Fonction de rappel déclenchée quand React récupère automatiquement des erreurs.
Se comporte comme onRecoverableError dans ReactDOMClient.createRoot.
wrapper
Passez un composant React comme option wrapper pour qu'il soit rendu autour de l'élément interne. C'est particulièrement utile pour créer des fonctions de rendu personnalisées réutilisables pour des fournisseurs de données communs. Voir la configuration pour des exemples.
queries
Requêtes à lier. Remplace l'ensemble par défaut de DOM Testing Library sauf si fusionné.
// 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},
})
Voir les helpers pour des conseils sur l'utilisation des fonctions utilitaires afin de créer des requêtes personnalisées.
Les requêtes personnalisées peuvent également être ajoutées globalement en suivant le guide de rendu personnalisé.
Options reactStrictMode pour render
Lorsqu'activé, <StrictMode> est rendu autour de l'élément interne. Si défini, remplace la valeur de reactStrictMode définie dans configure.
Résultat de render
La méthode render retourne un objet avec quelques propriétés :
...queries
La caractéristique la plus importante de render est que les requêtes de DOM Testing Library sont automatiquement retournées avec leur premier argument lié au baseElement, qui correspond par défaut à document.body.
Voir Requêtes pour une liste complète.
Exemple
const {getByLabelText, queryAllByTestId} = render(<Component />)
container
Le nœud DOM contenant votre élément React rendu (affiché via ReactDOM.render). C'est une div. Il s'agit d'un nœud DOM standard, vous pouvez donc appeler container.querySelector etc. pour inspecter les enfants.
Conseil : Pour obtenir l'élément racine de votre élément rendu, utilisez
container.firstChild.NOTE : Lorsque cet élément racine est un Fragment React,
container.firstChildrécupérera uniquement le premier enfant du Fragment, pas le Fragment lui-même.
⚠️ Si vous vous surprenez à utiliser
containerpour interroger des éléments rendus, vous devriez reconsidérer votre approche ! Les autres requêtes sont conçues pour être plus résilientes aux modifications apportées au composant testé. Évitez d'utilisercontainerpour interroger des éléments !
baseElement
Le nœud DOM contenant où votre élément React est rendu dans le conteneur. Si vous ne spécifiez pas le baseElement dans les options de render, il sera par défaut document.body.
Utile lorsque le composant à tester affiche des éléments en dehors de la div conteneur, par exemple pour tester des composants de type portal qui rendent leur HTML directement dans le body.
Note : les requêtes retournées par
renderexaminent le baseElement, vous pouvez donc utiliser des requêtes pour tester votre composant portal sans spécifier de baseElement.
debug
NOTE : Il est recommandé d'utiliser
screen.debugà la place.
Cette méthode est un raccourci pour 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})
Il s'agit d'un simple wrapper autour de prettyDOM, également exposé et provenant de
DOM Testing Library.
rerender
Il serait probablement préférable de tester le composant qui effectue la mise à jour des props pour s'assurer qu'elles sont correctement actualisées (voir la section Principes directeurs). Cela dit, si vous préférez mettre à jour les props d'un composant rendu dans votre test, cette fonction peut être utilisée pour actualiser les props du composant.
import {render} from '@testing-library/react'
const {rerender} = render(<NumberDisplay number={1} />)
// re-render the same component with different props
rerender(<NumberDisplay number={2} />)
unmount
Cela provoquera le démontage du composant rendu. C'est utile pour tester ce qui se passe lorsque votre composant est retiré de la page (par exemple vérifier que vous ne laissez pas de gestionnaires d'événements résiduels causant des fuites mémoire).
Cette méthode est une petite abstraction au-dessus de
ReactDOM.unmountComponentAtNode
import {render} from '@testing-library/react'
const {container, unmount} = render(<Login />)
unmount()
// your component has been unmounted and now: container.innerHTML === ''
asFragment
Retourne un DocumentFragment de votre composant rendu. Cela peut être utile si
vous devez éviter les liaisons actives et observer comment votre composant réagit aux événements.
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
Démonte les arbres React montés avec render.
Appelé automatiquement si votre framework de test (comme Mocha, Jest ou Jasmine) injecte une fonction globale
afterEach(). Sinon, vous devez appelercleanup()après chaque test.
Par exemple, si vous utilisez le framework de test ava,
vous devrez utiliser le hook test.afterEach comme suit :
import {cleanup, render} from '@testing-library/react'
import test from 'ava'
test.afterEach(cleanup)
test('renders into document', () => {
render(<div />)
// ...
})
// ... more tests ...
Ne pas appeler cleanup après avoir utilisé render peut entraîner une fuite mémoire
et des tests non "idempotents" (ce qui peut provoquer des erreurs difficiles à déboguer).
act
Il s'agit d'un léger wrapper autour de la
fonction act de react.
Son seul rôle est de transmettre tous les arguments à la fonction act si votre version de
React supporte act. Il est recommandé d'utiliser l'import depuis
@testing-library/react plutôt que react par souci de cohérence.
renderHook
Il s'agit d'un wrapper pratique autour de render avec un composant de test personnalisé. Cette
API est issue d'un modèle de test populaire et intéresse principalement les
bibliothèques publiant des hooks. Vous devriez privilégier render car un composant de test
personnalisé produit des tests plus lisibles et robustes, puisque l'élément à
tester n'est pas caché derrière une abstraction.
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>
Exemple :
import {renderHook} from '@testing-library/react'
test('returns logged in user', () => {
const {result} = renderHook(() => useLoggedInUser())
expect(result.current).toEqual({name: 'Alice'})
})
Options de renderHook
Option initialProps de renderHook
Définit les props transmises au callback de rendu lors du premier appel.
Elles ne seront pas transmises si vous appelez rerender sans 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})
})
NOTE : Lorsque vous utilisez
renderHookavec les optionswrapperetinitialProps, lesinitialPropsne sont pas transmises au composantwrapper. Pour fournir des props au composantwrapper, envisagez une solution comme :const createWrapper = (Wrapper, props) => {
return function CreatedWrapper({ children }) {
return <Wrapper {...props}>{children}</Wrapper>;
};
};
...
{
wrapper: createWrapper(Wrapper, { value: 'foo' }),
}
onCaughtError
Fonction de rappel déclenchée quand React intercepte une erreur dans un périmètre d'erreur (Error Boundary).
Se comporte comme onCaughtError dans ReactDOMClient.createRoot.
onRecoverableError
Fonction de rappel déclenchée quand React récupère automatiquement des erreurs.
Se comporte comme onRecoverableError dans ReactDOMClient.createRoot.
Option wrapper pour renderHook
Voir l'option wrapper pour render
Option reactStrictMode pour renderHook
Voir l'option reactStrictMode pour render
Résultat de renderHook
La méthode renderHook retourne un objet avec les propriétés suivantes :
result
Contient la valeur la plus récente validée retournée par la fonction de rendu :
import {renderHook} from '@testing-library/react'
const {result} = renderHook(() => {
const [name, setName] = useState('')
React.useEffect(() => {
setName('Alice')
}, [])
return name
})
expect(result.current).toBe('Alice')
Notez que la valeur est stockée dans result.current. Considérez result comme une
ref pour la valeur la plus récente validée.
rerender
Ré-exécute la fonction de rendu précédente avec de nouvelles 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
Démonte le hook testé.
import {renderHook} from '@testing-library/react'
const {unmount} = renderHook(({name = 'Alice'} = {}) => name)
unmount()
configure
Modifie les options globales. L'utilisation de base est documentée dans Configuration Options.
React Testing Library propose également des options dédiées.
import {configure} from '@testing-library/react'
configure({reactStrictMode: true})
Options de configure
reactStrictMode
Quand activé, un <StrictMode> est
rendu autour de l'élément interne. Par défaut : false.
Ce paramètre peut être modifié pour un test spécifique en fournissant reactStrictMode dans les options de la fonction render.