NEXT.JS nahm einen Entwicklungskurs ab, wodurch der von dieser Bibliothek verfolgte Testansatz veraltet ist. Nächste Seitentester -Wartungsprüfer empfehlen stattdessen Browser -Tests.
Das fehlende DOM -Integrationstest -Tool für Next.js.
In dieser Bibliothek wird die Matching -Seite in JSDOM mit den erwarteten Requisiten aus dem Routing -System und den Datenabrufmethoden von Next.js enthält.
import { getPage } from 'next-page-tester' ;
import { screen , fireEvent } from '@testing-library/react' ;
describe ( 'Blog page' , ( ) => {
it ( 'renders blog page' , async ( ) => {
const { render } = await getPage ( {
route : '/blog/1' ,
} ) ;
render ( ) ;
expect ( screen . getByText ( 'Blog' ) ) . toBeInTheDocument ( ) ;
fireEvent . click ( screen . getByText ( 'Link' ) ) ;
await screen . findByText ( 'Linked page' ) ;
} ) ;
} ) ; Die Idee hinter dieser Bibliothek ist es, so genau wie möglich zu reproduzieren, wie es als nächstes funktioniert. Js funktioniert, ohne Server zu spinnen, und die Ausgabe in einer lokalen JSDOM -Umgebung zu rendern.
Um eine wertvolle Testerfahrung next-page-tester zu bieten, reproduziert der Rendering-Fluss einer tatsächlichen next.js -Anwendung :
head ). Die montierte Anwendung ist interaktiv und kann mit jeder DOM-Testbibliothek getestet werden (wie @testing-library/react ).
next-page-tester kümmert sich um:
getServerSideProps , getInitialProps oder getStaticProps ) an, wenn der Fall_app und _documentLink , router.push , router.replaceredirect zurücknext/router , next/head , next/link , next/config und Umgebungsvariablen getPage akzeptiert ein Optionsobjekt und gibt 4 Werte zurück:
import { getPage } from 'next-page-tester' ;
const { render , serverRender , serverRenderToString , page } = await getPage ( {
options ,
} ) ; Typ: () => { nextRoot: HTMLElement<NextRoot> }
Gibt zurück: #__next Root Element Element.
Wenn Sie nicht über einen erweiterten Anwendungsfall verfügen, sollten Sie diese Methode meistens anwenden. Unter der Motorhaube ruft es serverRender() auf und montiert/hydratiert die React -Anwendung in JSDOM #__next Root -Element. Dies ist, was Benutzer beim Besuch einer Seite bekommen/sehen würden.
Typ: () => { nextRoot: HTMLElement<NextRoot> }
Gibt zurück: #__next Root Element Element.
Injizieren Sie die Ausgabe der Serverseite in das DOM, reagieren jedoch nicht. Verwenden Sie es, um zu testen, wie Next.js in den folgenden Szenarien rendert:
Typ: () => { html: string }
Rendern Sie die Ausgabe der Serverseite als HTML -Zeichenfolge. Dies ist eine reine Methode ohne Nebenwirkungen.
Typ: React.ReactElement<AppElement>
Reagieren Sie Element der Anwendung.
| Eigentum | Beschreibung | Typ | Standard |
|---|---|---|---|
| Route (obligatorisch) | Nächste Route (muss mit / ) beginnen | string | - - |
| Req | Verbessern Sie das verspottete Anforderungsobjekt aus dem Standard | req => req | - - |
| res | Verbessern Sie das verspottete Antwortobjekt aus dem Standard | res => res | - - |
| Router | Verbessern Sie den Standard -Router -Objekt aus Standardverspottet | router => router | - - |
| Usapp | Benutzerdefinierte App -Komponente rendern | boolean | true |
| Dokumentkomponente rendern | boolean | false | |
| Nextroot | Absoluter Pfad zum nächsten.js Root -Ordner | string | automatisch erkannt |
| dotenvfile | Relativer Weg zu einer .env -Datei -Holding -Umgebungsvariablen | string | - - |
| Wrapper | Absolute Pfad zur Wrappers -Datei. Nützlich, um den Komponentenbaum mit verspotteten Anbietern zu dekorieren. | string | - - |
| SharedModules | Liste der Module, die die Identität zwischen Client- und Serverkontext bewahren sollten. | string[] | [] |
Wenn Ihre Seiten/Komponenten Dateitypen importieren, die nicht von Node.js (wie Stilblätter, Bilder, .svg , ...) nicht behandelt werden, sollten Sie Ihre Testumgebung so konfigurieren, dass sie sie ordnungsgemäß verarbeiten. ZB im Falle eines Scherzes möchten Sie möglicherweise einige moduleNameMapper konfigurieren.
next-page-tester erwartet, dass er in eine JSDOM-Umgebung trifft. Wenn Sie Scherz verwenden, fügen Sie diese Zeile Ihrer jest hinzu:
"testEnvironment" : "jsdom" , Da Next.js nicht in einer JSDOM -Umgebung ausgelegt ist, müssen wir das Standard -JSDOM einrichten, um ein reibungsloseres Testerlebnis zu ermöglichen. Standardmäßig wird next-page-tester :
window.scrollTo IntersectionObserver . Sie können jedoch die automatische Reinigung und die Initialisierung der Helfer überspringen, indem Sie die Variable NPT_SKIP_AUTO_SETUP auf true einstellen. Sie können dies mit cross-env -Like tun:
cross - env NPT_SKIP_AUTO_SETUP = true jestWenn Sie Scherz V26 verwenden, müssen Sie es möglicherweise pflücken, um Module mit geeigneten Server-/Client -Umgebungen zu laden. Die Wartungsbemühungen richten sich an die neueste Scherzversion.
Unter Beispiele-Ordner dokumentieren wir die Testfälle, die next-page-tester ermöglicht.
next-page-tester konzentriert sich darauf, nur die letzte Version von Next.js und Scherz zu unterstützen:
| Nächstes-Page-Tester | Weiter.js | Scherz |
|---|---|---|
| v0.1.0 -> v0.7.0 | v9.xx | v26.xx |
| v0.8.0 -> v0.22.0 | v10.0.0 -> v10.0.7 | |
| v0.23.0 -> v0.25.x | v10.0.8 -> v11.0.x | |
| v0.26.0 -> v0.27.x | v10.0.8 -> v11.0.x | v27.xx |
| v0.28.0 -> v0.28.x | v11.1.0 | |
| v0.29.0 + | v11.1.1 -> v11.x | |
| v0.31.0 + | v12.1.0 | |
| v0.32.0 + | v12.1.1 + |
Seit:
Bitte beachten Sie, dass wir die Unterstützung für zukünftige Versionen von Next.js nicht garantieren können. Sogar Patch oder kleinere Versionen könnten brechen. In diesem Fall müssen Sie darauf warten, dass eine neue Version next-page-tester veröffentlichen wird.
Beiträge sind sehr willkommen und wir tun unser Bestes, um externe Mitwirkende zu unterstützen.
req und res Objekte werden mit Node-Mocks-Http verspottet@types/react-dom und @types/webpack zu installieren, wenn Sie den TypeScript im strict Modus verwenden, aufgrund dieses FehlersuseDocument Die Option useDocument ist teilweise implementiert und kann instabil sein.
Der erste vorgeschlagene Weg, um Netzwerkanfragen zu verspotten, besteht aus der Verspottung in der Netzwerkschicht mit Bibliotheken wie Mock service worker und Mirage JS .
Ein weiterer praktikabler Ansatz könnte darin bestehen, das globale fetch Objekt mit Bibliotheken wie fetch-mock zu verspotten.
Falls Sie einen traditionelleren Ansatz wünschen, bei dem die Benutzer Landmodule verspottet werden, die für das Abrufen von Daten verantwortlich sind, müssen Sie einen zusätzlichen Schritt in Betracht ziehen: Da next-page-tester Module zwischen "Client" und "Server" -Rendern isoliert, werden die in Tests erstellten Mocks (z. B. Datenerziehungsmethoden) nicht ausgeführt.
Um dies zu überwinden, müssen wir solche Module "verdichten", um ihre Identität zwischen "Client" und "Server" -Kontext zu erhalten/zu teilen), indem wir sie über die Option sharedModules weitergeben.
test ( 'as a user I want to mock a module in client & server environment' , async ( ) => {
const stub = jest . spyOn ( api , 'getData' ) . mockReturnValue ( Promise . resolve ( 'data' ) )
const { render } = await getPage ( {
route : '/page' ,
nextRoot ,
sharedModules : [ ` ${ process . cwd ( ) } /src/path/to/my/module` ] ,
} ) ;
expect ( stub ) . toHaveBeenCalledTimes ( 1 ) ; // this was executed in your data fetching method
} Sie können Cookies festlegen, indem Sie sie an document.cookie anhängen, bevor Sie getPage anrufen. next-page-tester wird Cookies an ctx.req.headers.cookie ausbreiten, damit sie den Datenabrufmethoden zur Verfügung stehen. Dies gilt auch für nachfolgende Abfassungsmethodenaufrufe, die durch die Client -Seitennavigation ausgelöst werden.
test ( 'authenticated page' , async ( ) => {
document . cookie = 'SessionId=super=secret' ;
document . cookie = 'SomeOtherCookie=SomeOtherValue' ;
const { render } = await getPage ( {
route : '/authenticated' ,
} ) ;
render ( ) ;
} ) ; Hinweis: document.cookie wird nicht automatisch aufgeräumt. Sie müssen es nach jedem Test manuell klären, um alles isoliert zu halten.
NEXT.JS Link -Komponente ruft window.scrollTo auf. Um den Fehler zu beheben, sollten Sie Ihre Testumgebung einrichten oder Ihr eigenes window.scrollTo angeben.
Diese Warnung bedeutet, dass Ihre Seite zwischen Server und Browser anders macht. Dies kann ein erwartetes Verhalten sein oder einen Fehler in Ihrem Code signalisieren.
Diese Warnung bedeutet, dass Ihre Anwendung während des Rendering -Prozesses einige nicht verspottete Netzwerkanforderungen durchführt. Sie sollten sie finden und nach Bedarf verspotten.
trailingSlash -Option_error Seite renderndebug -Option zur Protokollierung von Ausführungsinformationen an Vielen Dank an diese wunderbaren Menschen (Emoji -Schlüssel):
Andrea Carraro ? | Matej Šnuderl ? | Jason Williams ? | Arelaxend ? | Kfazinic ? | Tomasz Rondio ? | Alexander Mendes |
Jan Sepke ? | Davidorchard ? | Doaa ismael ? | Andrew Hurle ? | Massimeddu-sonic ? | Jess Telford ? | Joseph ? |
Gergo Tolnai ? | Brett ? | Vlad Elagin | Daniel Stockman | Madeuz | Dr. Derek Austin ? | Feargal ? |
Jan R. Biasi ? | Otávio Augusto steigt ? |
Dieses Projekt folgt der All-Contributors-Spezifikation. Beiträge jeglicher Art willkommen!