Wie testet man mit Jest und React-Testing-Library die Nichtexistenz eines Elements?
Lesezeit: 5 Minuten
Etwas ist los
Ich habe eine Komponentenbibliothek, in der ich Komponententests für die Verwendung von Jest und der React-Testing-Bibliothek schreibe. Basierend auf bestimmten Requisiten oder Ereignissen möchte ich überprüfen, ob bestimmte Elemente nicht gerendert werden.
getByText, getByTestIdusw. werfen und Fehler einwerfen react-testing-library Wenn das Element nicht gefunden wird, schlägt der Test vor dem fehl expect Funktion wird ausgelöst.
Wie testet man mit der React-Testing-Library auf etwas, das im Scherz nicht existiert?
Ich meine, die Tatsache, dass diese Frage so beliebt war, spricht dafür, wie intuitiv die API ist.
Der Standard getBy Methoden geben einen Fehler aus, wenn sie ein Element nicht finden können, also wenn Sie eine Behauptung aufstellen möchten, dass ein Element vorhanden ist nicht im DOM vorhanden ist, können Sie verwenden queryBy APIs stattdessen:
const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist
Der queryAll Die API-Version gibt ein Array übereinstimmender Knoten zurück. Die Länge des Arrays kann für Behauptungen nützlich sein, nachdem Elemente zum DOM hinzugefügt oder daraus entfernt wurden.
const submitButtons = screen.queryAllByText('submit')
expect(submitButtons).toHaveLength(2) // expect 2 elements
not.toBeInTheDocument
Der jest-dom Die Dienstprogrammbibliothek bietet die .toBeInTheDocument() Matcher, der verwendet werden kann, um sicherzustellen, dass sich ein Element im Hauptteil des Dokuments befindet oder nicht. Dies kann aussagekräftiger sein als die Bestätigung eines Abfrageergebnisses null.
import '@testing-library/jest-dom/extend-expect'
// use `queryBy` to avoid throwing an error with `getBy`
const submitButton = screen.queryByText('submit')
expect(submitButton).not.toBeInTheDocument()
Meine schlechten Kentcdodds, danke. ich benutzte getByTestId und bekam den gleichen Fehler. Und ich habe die FAQ nicht überprüft, tut mir leid. Tolle Bibliothek! Können Sie Ihre Antwort so ändern, dass sie „.toBeNull();“ enthält?
Und queryByText für diejenigen, die das Äquivalent wollen getByText das ist nullsicher
– S..
3. August 2019 um 9:26 Uhr
Verwenden queryBy / queryAllBy.
Wie du sagst, getBy* Und getAllBy* Gibt einen Fehler aus, wenn nichts gefunden wird.
Allerdings sind die entsprechenden Methoden queryBy* Und queryAllBy* stattdessen zurückkehren null oder []:
queryBy
queryBy* Abfragen geben den ersten passenden Knoten für eine Abfrage zurück und geben zurück null wenn keine Elemente übereinstimmen. Dies ist nützlich, um ein Element zu bestätigen, das nicht vorhanden ist. Dies wird ausgelöst, wenn mehr als eine Übereinstimmung gefunden wird (verwenden Sie stattdessen queryAllBy).
queryAllBy queryAllBy* Abfragen geben ein Array aller übereinstimmenden Knoten für eine Abfrage und ein leeres Array zurück ([]), wenn keine Elemente übereinstimmen.
Für die beiden, die Sie erwähnt haben, würden Sie also stattdessen verwenden queryByText Und queryByTestIdaber diese funktionieren für alle Abfragen, nicht nur für diese beiden.
Das ist viel besser als die akzeptierte Antwort. Ist diese API neuer?
– RubbelDieKatz
25. November 2019 um 10:13 Uhr
Danke für die netten Worte! Dies ist im Grunde die gleiche Funktionalität wie die akzeptierte Antwort, daher glaube ich nicht, dass es sich um eine neuere API handelt (aber ich könnte mich irren). Der einzige wirkliche Unterschied zwischen dieser Antwort und der akzeptierten Antwort besteht darin, dass die akzeptierte Antwort besagt, dass es nur eine Methode gibt, die dies tut (queryByTestId), obwohl es tatsächlich zwei ganze Gruppen von Methoden gibt, von denen queryByTestId ist ein konkretes Beispiel.
– Sam
25. November 2019 um 14:23 Uhr
Danke, das wäre mir viel lieber, als Test-IDs festzulegen
– Hylle
22. April 2020 um 22:27 Uhr
Vielen Dank für diese ausführliche Erklärung. Es ist ein so subtiler Unterschied, dass ich ihn nicht gesehen habe, obwohl ich mir ihr Beispiel hier angesehen habe: github.com/testing-library/jest-dom#tobeinthedocument :face-palm:
– Johannes
2. Februar 2021 um 16:10 Uhr
Ich musste wissen, wie man das für getByTestId macht, da ich darauf zugreifen möchte. Mir war nicht bewusst, dass sie eine queryByTestId hatten, die mich mindestens eine weitere Abfrage bei DuckDuckGo gekostet hätte und wer weiß, wie viel zusätzliche Zeit es gedauert hätte, eine geeignete Lösung zu finden. Mucho Graciaaahhh!
– A-Dubb
31. August 2022 um 8:03 Uhr
getBy* gibt einen Fehler aus, wenn kein Element gefunden wird, sodass Sie dies überprüfen können
expect(() => getByText('your text')).toThrow('Unable to find an element');
Das kann ziemlich fehleranfällig sein. Fehlerauslösungen werden zu Debugzwecken und nicht zur Überprüfung verwendet.
– Milen Gardev
6. Januar 2021 um 17:03 Uhr
Dies funktionierte in meinem Fall jedoch erst nach Verwendung der Pfeilfunktion. Können Sie mir bitte mitteilen, warum wir es brauchen? Ohne geht es nicht.
– Rahul Mahadik
5. Juli 2022 um 6:42
@RahulMahadik, weil „expect(…)“ die anonyme Funktion aufruft, wenn sie bereit ist, einen ausgelösten Fehler zu erkennen/abzufangen. Wenn Sie die anonyme Pfeilfunktion weglassen, rufen Sie bei der Codeausführung sofort eine Wurffunktion auf, die die Ausführung sofort unterbricht.
– Ian MacFarlane
23. August 2022 um 1:00 Uhr
const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist
expect(submitButton).not.toBeNull() // it exist
Sie müssen queryByTestId anstelle von getByTestId verwenden.
Hier ein Codebeispiel, in dem ich testen möchte, ob die Komponente mit der ID „Auto“ nicht vorhanden ist.
describe('And there is no car', () => {
it('Should not display car mark', () => {
const props = {
...defaultProps,
base: null,
}
const { queryByTestId } = render(
<IntlProvider locale="fr" messages={fr}>
<CarContainer{...props} />
</IntlProvider>,
);
expect(queryByTestId(/car/)).toBeNull();
});
});
Matrixb0ss
Hat für mich geklappt (wenn Sie getByTestId verwenden möchten):
expect(() => getByTestId('time-label')).toThrow()
n1koloza
Ich hoffe, das wird hilfreich sein
Diese Tabelle zeigt, warum/wann Funktionsfehler auftreten
welche Funktionen asynchron sind
Was ist eine Return-Anweisung für eine Funktion?
Das kann mir helfen, ich verwende queryByTestId() und überprüfe es mit toBeNull()
– Pranat Pannao
17. Februar um 16:35 Uhr
14546500cookie-checkWie testet man mit Jest und React-Testing-Library die Nichtexistenz eines Elements?yes
Ich meine, die Tatsache, dass diese Frage so beliebt war, spricht dafür, wie intuitiv die API ist.
– Cristian E.
10. Mai 2022 um 14:29 Uhr