React-Testing-Library – Bildschirm- und Renderabfragen

Lesezeit: 3 Minuten

Erazihels Benutzeravatar
Erazihel

Es gibt zwei Möglichkeiten, Abfragen zu verwenden react-testing-library.

Sie können entweder die von zurückgegebenen Abfragen verwenden render Methode:

import React from 'react'
import { render } from '@testing-library/react'

...

const { getByText } = render(<div>Foo</div>)

expect(getByText('Foo')).toBeInTheDocument()

Oder Sie können das verwenden screen Objekt:

import React from 'react'
import { render, screen } from '@testing-library/react'

...

render(<div>Foo</div>)

expect(screen.getByText('Foo')).toBeInTheDocument()

In der Dokumentation gibt es jedoch keinen Hinweis darauf, welche Option die beste ist und warum.

Kann mich jemand aufklären?

Benutzeravatar von rrebase
rebase

Die neueste empfohlene Option von react-testing-library Autor Kent C. Dodds sich selbst ist zu nutzen screen.

Der Vorteil der Verwendung screen ist es nicht mehr nötig, das aufzubewahren? render Rufen Sie die Destrukturierung auf dem neuesten Stand auf, wenn Sie die benötigten Abfragen hinzufügen/entfernen. Sie müssen nur tippen screen. Den Rest erledigt die magische Autovervollständigung Ihres Editors.

Die einzige Ausnahme hiervon ist, wenn Sie das festlegen container oder baseElement was Sie wahrscheinlich vermeiden sollten (ich kann mir ehrlich gesagt keinen legitimen Anwendungsfall mehr für diese Optionen vorstellen und sie existieren derzeit nur aus historischen Gründen).

Quelle: https://kentcdodds.com/blog/common-mistakes-with-react-testing-library#not-using-screen

  • Was bedeutet dieser Teil? keep the render call destructure up-to-date as you add/remove the queries you need

    – Brady Dowling

    7. Januar 2021 um 19:38

  • @BradyDowling render gibt ein Objekt zurück, das Sie zerstören können, z const { getByText } = render(<MyComponent />). Wenn Sie eine andere Abfrage verwenden möchten, müssen Sie dieses destrukturierte Objekt aktualisieren: const { getByText, getByLabelText } = render(<MyComponent />). Mit screenalle Methoden sind auf dem Objekt selbst verfügbar (screen.getByText, screen.getByLabelTextusw.)

    – Joey MH

    12. Januar 2021 um 9:23 Uhr


  • @JoeyM-H With screen, all the methods are available on the object itself Es scheint, dass dies bereits für die Komponente gilt, die vom Rendern zurückgegeben wird. Anscheinend können Sie die Destrukturierung der gerenderten Komponente einfach überspringen und den gleichen Vorteil erzielen, aber ich glaube, ich übersehe etwas Wichtiges.

    – Brady Dowling

    12. Januar 2021 um 19:33 Uhr

  • @BradyDowling, Sie haben Recht, aber es ist immer noch etwas weniger ausführlich, ein global importiertes zu verwenden screen statt die Rückgabe von zuzuweisen render() jedes Mal in eine Variable, insbesondere wenn Sie viele Tests in eine Datei schreiben. Hier ist die PR des Features, mit einer längeren Erklärung des Autors github.com/testing-library/dom-testing-library/pull/412 Anscheinend hilft es auch, einige andere Randfälle zu vermeiden.

    – Joey MH

    13. Januar 2021 um 14:02 Uhr

  • Aus der Diskussion geht hervor, dass das von der Renderfunktion zurückgegebene Objekt Framework-spezifisch sein könnte, aber das screen Das Objekt ist Framework-unabhängig, wodurch Ihre Tests projektübergreifend robuster und konsistenter werden.

    – Brady Dowling

    14. Januar 2021 um 16:22 Uhr

screen wird bereitgestellt von @testing-library/domwelches ist was @testing-library/react darauf aufgebaut ist. Bei Verwendung des screen Methoden werden sie innerhalb des HTML abfragen <body> Element, wie im beschrieben Dokumente:

Da die Abfrage des gesamten document.body sehr häufig vorkommt, exportiert die DOM Testing Library auch ein Bildschirmobjekt, das jede Abfrage enthält, die vorab an document.body gebunden ist

render() ist nur drin @testing-library/react. Es gibt ein ähnliches Objekt zurück screen und standardmäßig werden die Abfragen auch an die gebunden <body>. Standardmäßig gibt es kaum Unterschiede, Sie können das Verhalten jedoch anpassen Übergeben von Optionen.

Das können Sie zum Beispiel Geben Sie ein Element an anders als die <body> intern abfragen und sogar bereitstellen können benutzerdefinierte Abfragemethoden.

Um Ihre Frage zu beantworten, welches das Beste ist, würde ich verwenden sagen render() ist besser, weil die options Machen Sie es flexibler, aber um das zu zitieren Dokumente:

Sie müssen nicht oft Optionen angeben

Dennoch würde ich es vorziehen, die von bereitgestellten Methoden zu verwenden render()denn wenn Sie sich jemals dazu entschließen, Optionen hinzuzufügen, müssen Sie nicht daran denken, alle Ihre Abfragen zu ändern.

1453240cookie-checkReact-Testing-Library – Bildschirm- und Renderabfragen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy