So testen Sie einen Klassennamen mit der Jest- und React-Testbibliothek

Lesezeit: 7 Minuten

Benutzer-Avatar
Giesburts

Ich bin völlig neu im JavaScript-Testen und arbeite in einer neuen Codebasis. Ich möchte einen Test schreiben, der nach einem Klassennamen für das Element sucht. Ich arbeite mit Jest und Reaktionstestbibliothek. Unten habe ich einen Test, der eine Schaltfläche basierend auf rendert variant Stütze. Es enthält auch einen Klassennamen und das würde ich gerne testen.

it('Renders with a className equal to the variant', () => {
    const { container } = render(<Button variant="default" />)
    expect(container.firstChild) // Check for className here
})

Ich habe versucht, nach einer Eigenschaft wie Enzyme zu googeln hasClass, aber ich konnte nichts finden. Wie kann ich das mit den aktuellen Bibliotheken lösen (Reaktionstestbibliothek und Scherz)?

  • Sie sollten Enzyme verwenden, es soll aus genau diesem Grund mit Witz arbeiten. Jest eignet sich hervorragend zum Testen der Funktionalität, Enzyme zum Testen und Rendern von Komponenten.

    – AnonymSB

    20. November 2018 um 9:56 Uhr

  • In Anlehnung an den Kommentar von @AnonymousSB ist Enzyme großartig, wenn Sie sich mehr mit der Testimplementierung befassen, während die React Testing Library für diejenigen gedacht ist, die einen stärker auf das Benutzerverhalten ausgerichteten Testansatz verfolgen.

    – James B. Nall

    14. Juli 2020 um 14:19 Uhr

  • Um beides weiter zu verfolgen – Entwickler, die erwägen, Enzyme in einem neuen Projekt zu verwenden, sollten beachten, dass es laut Enzymes Dokumentation nur bis zu React 16 unterstützt. Es scheint keine Pläne zu geben, ein Upgrade durchzuführen, um aktuelle Versionen von React zu unterstützen. Mehr Infos unter dev.to/wojtekmaj/enzyme-is-dead-now-what-ekl

    – Andreas

    21. März um 17:09 Uhr

Benutzer-Avatar
Giorgio Polvara – Gpx

Das geht ganz einfach mit der React-Testing-Library.

Das muss man erstmal verstehen container oder das Ergebnis von getByText usw. sind lediglich DOM-Knoten. Sie können mit ihnen auf die gleiche Weise interagieren, wie Sie es in einem Browser tun würden.

Wenn Sie also wissen möchten, auf welche Klasse angewendet wird container.firstChild du kannst es einfach so machen container.firstChild.className.

Wenn Sie mehr darüber lesen className in MDN Sie werden sehen, dass es zurückkehrt alle die Klassen, die auf Ihr Element angewendet werden, getrennt durch ein Leerzeichen, das heißt:

<div class="foo">     => className === 'foo'
<div class="foo bar"> => className === 'foo bar'

Dies ist je nach Fall möglicherweise nicht die beste Lösung. Keine Sorge, Sie können beispielsweise eine andere Browser-API verwenden classList.

expect(container.firstChild.classList.contains('foo')).toBe(true)

Das ist es! Sie müssen keine neue API lernen, die nur für Tests funktioniert. Es ist genauso wie im Browser.

Wenn Sie häufig nach einer Klasse suchen, können Sie die Tests vereinfachen, indem Sie sie hinzufügen Scherzdom zu Ihrem Projekt.

Der Test wird dann:

expect(container.firstChild).toHaveClass('foo')

Es gibt eine Reihe anderer praktischer Methoden wie z toHaveStyle das könnte dir helfen.


Nebenbei bemerkt, React-Testing-Library ist ein richtiges Dienstprogramm zum Testen von JavaScript. Es hat viele Vorteile gegenüber anderen Bibliotheken. Ich ermutige Sie, sich dem anzuschließen Spektrum-Forum wenn JavaScript-Tests neu für Sie sind.

  • Hey! Ich sehe, dass Sie verwenden toBeTrue aber aus irgendeinem grund bekomme ich das hin TypeError: expect(...).toBeTrue is not a function. Ich verwende die neueste Jest-Version. Das toHaveClass funktioniert gut!

    – Giesburst

    20. November 2018 um 11:22 Uhr

  • Mein schlechtes es ist toBe(true) Ich habe es repariert. ich benutze toHaveClass allerdings viel einfacher

    – Giorgio Polvara – Gpx

    20. November 2018 um 14:47 Uhr

  • @GiorgioPolvara-Gpx Ich denke immer noch, dass es ein hackiger Weg ist, dies zu tun, wenn die Bibliothek die getByClass-Methode nicht unterstützt.

    – Jaspreet Singh

    16. Juli 2019 um 5:26 Uhr

  • Die Bibliothek hat keine getByClass -Methode, weil sie Sie zum Testen drängen möchte, wie es ein Benutzer tun würde. Benutzer sehen keine Klassen. Aber wenn Sie aus irgendeinem Grund die gerenderten Klassen testen möchten, ist dies der richtige Weg.

    – Giorgio Polvara – Gpx

    16. Juli 2019 um 8:54 Uhr

  • Sie müssen es in zwei Schritten tun, einen für foo und die andere für bar

    – Giorgio Polvara – Gpx

    25. Februar 2020 um 14:18 Uhr

Benutzer-Avatar
jbmilgrom

Die Bibliothek ermöglicht den Zugriff auf normale DOM-Selektoren, sodass wir dies auch einfach tun können:

it('Renders with a className equal to the variant', () => {
    const { container } = render(<Button variant="default" />)
    expect(container.getElementsByClassName('default').length).toBe(1);
});

Benutzer-Avatar
kasongoyo

Sie müssen die Philosophie dahinter verstehen Reaktionstest-Bibliothek zu verstehen, was man damit machen kann und was nicht;

Das Ziel dahinter Reaktionstest-Bibliothek ist für die Tests, Implementierungsdetails Ihrer Komponenten zu vermeiden und sich stattdessen darauf zu konzentrieren, Tests zu schreiben, die Ihnen das Vertrauen geben, für das sie bestimmt sind.

Das Abfragen von Elementen nach Klassenname ist also nicht mit dem ausgerichtet Reaktionstest-Bibliothek Philosophie, da sie Implementierungsdetails enthält. Der Klassenname ist eigentlich das Implementierungsdetail eines Elements und ist etwas, das der Endbenutzer nicht sieht, und er kann jederzeit im Lebenszyklus des Elements geändert werden.

Anstatt also nach Elementen zu suchen, die der Benutzer nicht sehen kann und die sich jederzeit ändern können, versuchen Sie einfach, nach etwas zu suchen, das der Benutzer sehen kann, z. B. Text, Beschriftung oder etwas, das im Lebenszyklus des Elements konstant bleibt wie Daten-ID.

Um Ihre Frage zu beantworten, ist es nicht ratsam, den Klassennamen zu testen, und daher können Sie dies nicht tun Reaktionstest-Bibliothek. Versuchen Sie es mit anderen Testbibliotheken wie z Enzym oder React-Dom-Test-Dienstprogramme.

  • Ich habe diese Antwort schon einmal hier und von den Autoren der React-Testing-Library gesehen. Ich habe es nie verstanden. “Klassennamen” sind per Definition Dinge, die Benutzer sehen werden. Sie stehen an vorderster Front der Benutzererfahrung. Es wäre schön zu wissen, ob ein lebenswichtiger Klassenhelfer auf ein Element angewendet wurde, damit das Element beispielsweise sichtbar wird.

    – mrbinky3000

    26. November 2019 um 18:10 Uhr

  • Hinzu kommt, dass einige CSS-Bibliotheken wie die semantische Benutzeroberfläche das DOM lesbarer machen, indem sie sich seine CSS-Klassen ansehen. Sie haben also so etwas wie

    oder ein

    usw. Ohne die Abfrage nach Klasse ist es bei der Verwendung von sematic ui schwer zu behaupten

    – sethu

    16. Januar 2020 um 20:54 Uhr

  • @ mrbinky3000 Sie können das Vorhandensein / Fehlen von Klasse im Element testen, und das ist sehr gut und wird von RTL bei Verwendung mit gut unterstützt Scherzdom. Ameisenmuster finden das Element mithilfe von className in Tests.

    – kasongoyo

    17. Januar 2020 um 9:03 Uhr

  • @mrbinky3000 Benutzer können keine Klassennamen sehen. Obwohl es in der Praxis nicht immer möglich ist, etwas zu testen, ohne Implementierungsdetails zu testen.

    – dan-classon

    13. Mai 2020 um 13:14 Uhr

  • Den prod cod mit data-testid durcheinander zu bringen ist für mich größer, als das class-Attribut zu verwenden, um im gerenderten Code zu suchen. Ganz zu schweigen davon, dass Sie nicht wirklich eine Wahl haben, wenn Sie die Darstellung eines Codes von Drittanbietern überprüfen möchten. Es sei denn, Sie wollen alles verspotten. Was etwa Leute die auch Videos machen nicht zu tun haben. Ich denke, es handelt sich um eine großartige Philosophie, aber nicht um einen praktischen Ansatz.

    – bmolnar

    24. Dezember 2020 um 11:27 Uhr

Sie können benutzerdefinierte Matcher von testing-library/jest-dom verwenden.

Die @testing-library/jest-dom-Bibliothek bietet eine Reihe benutzerdefinierter Jest-Matcher, mit denen Sie Jest erweitern können. Dadurch werden Ihre Tests aussagekräftiger, klarer zu lesen und zu pflegen.

https://github.com/testing-library/jest-dom#tohaveclass

it('Renders with a className equal to the variant', () => {
    const { container } = render(<Button variant="default" />)

    expect(container.firstChild).toHaveClass('class-you-are-testing') 
})

Dies kann global in einem eingerichtet werden setupTest.js Datei

import '@testing-library/jest-dom/extend-expect';
import 'jest-axe/extend-expect';
// etc

Benutzer-Avatar
Yazan Najjar

Du solltest benutzen toHaveClass von Jest. Keine Notwendigkeit, mehr Logik hinzuzufügen.

it('Renders with a className equal to the variant', () => {
    const { container } = render(<Button variant="default" />)
    expect(container.firstChild).toHaveClass(add you className);
//You Can Also You Screen Instead Of Using Container Container Not Recommended To Use As Documentation Said
    expect(screen.getByRole('button')).toHaveClass(add you className)
})

  • Im Grunde dasselbe wie vorhandene Antworten, jedoch mit weniger Kontext.

    – ggorlen

    20. Mai um 17:21 Uhr

Benutzer-Avatar
Shamaz sagte

Sie können toHaveClass von jest DOM verwenden

  it('renders textinput with optional classes', () => {
    const { container } = render(<TextArea {...props} className="class1" />)
    expect(container.children[1]).toHaveClass('class1')
  })

Vergessen Sie nicht, die Antwort wie diesen {Container} zu destrukturieren, da React Testing Library standardmäßig ein div erstellt und dieses div an document.body anhängt, und hier wird Ihre React-Komponente gerendert. Wenn Sie über diese Option einen eigenen HTMLElement-Container bereitstellen, wird dieser nicht automatisch an document.body angehängt.

  • Im Grunde dasselbe wie vorhandene Antworten, jedoch mit weniger Kontext.

    – ggorlen

    20. Mai um 17:21 Uhr

Benutzer-Avatar
YinPeng.Wei

    // Link.react.test.js
import React from 'react';
import ShallowRenderer from 'react-test-renderer/shallow';
import App from './../../src/App'
describe('React', () => {
  it('className', () => {
    const renderer = new ShallowRenderer();
    renderer.render(<App />);
    const result = renderer.getRenderOutput();
    expect(result.props.className.split(' ').includes('welcome-framework')).toBe(true);
  });
});

1256620cookie-checkSo testen Sie einen Klassennamen mit der Jest- und React-Testbibliothek

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

Privacy policy