Wie testet man mit Jest und React-Testing-Library die Nichtexistenz eines Elements?

Lesezeit: 5 Minuten

Benutzeravatar von SomethingOn
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.

    – Cristian E.

    10. Mai 2022 um 14:29 Uhr

Benutzeravatar von kentcdodds
kentcdodds

Aus DOM Testing-Bibliotheksdokumente – Erscheinen und Verschwinden

Behauptende Elemente sind nicht vorhanden

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?

    – SomethingOn

    12. Okt. 2018 um 16:58

  • Ich glaube, der obige Link sollte darauf hinweisen React-Testing-Library-Dokumente

    – pbre

    4. Januar 2019 um 16:59

  • Die neue Dokumentationsseite wurde vor einigen Tagen veröffentlicht. Ich hätte einen dauerhafteren Link verwenden sollen. Danke für das Update @pbre!

    – kentcdodds

    4. Januar 2019 um 20:18

  • Eine weitere praktische Ressource: testing-library.com/docs/react-testing-library/cheatsheet

    – SomethingOn

    8. April 2019 um 18:50 Uhr

  • 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.

https://testing-library.com/docs/dom-testing-library/api-queries#queryby

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();
  });
});

Benutzeravatar von matrixb0ss
Matrixb0ss

Hat für mich geklappt (wenn Sie getByTestId verwenden möchten):

expect(() => getByTestId('time-label')).toThrow()

Benutzeravatar von n1koloza
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?

Geben Sie hier eine Bildbeschreibung ein

  • Das kann mir helfen, ich verwende queryByTestId() und überprüfe es mit toBeNull()

    – Pranat Pannao

    17. Februar um 16:35 Uhr

1454650cookie-checkWie testet man mit Jest und React-Testing-Library die Nichtexistenz eines Elements?

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

Privacy policy