Zum Hauptinhalt springen
Version: 29.7

Fehlerbehebung

Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Hoppla, etwas ist schiefgelaufen? Nutze diese Anleitung, um Probleme mit Jest zu lösen.

Tests schlagen fehl und Sie wissen nicht warum

Versuche die in Node integrierte Debugging-Unterstützung zu nutzen. Platziere eine debugger;-Anweisung in einem deiner Tests und führe dann im Projektverzeichnis aus:

node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]

Dies führt Jest in einem Node-Prozess aus, an den sich ein externer Debugger verbinden kann. Beachte, dass der Prozess pausiert, bis der Debugger verbunden ist.

Für das Debugging in Google Chrome (oder einem Chromium-basierten Browser) öffne deinen Browser, gehe zu chrome://inspect und klicke auf "Open Dedicated DevTools for Node". Dies zeigt eine Liste verfügbarer Node-Instanzen an. Klicke auf die im Terminal angezeigte Adresse (typischerweise localhost:9229) und debugge Jest mit Chrome DevTools.

Die Chrome Developer Tools werden angezeigt mit einem Breakpoint in der ersten Zeile des Jest-CLI-Skripts (dies gibt dir Zeit, die Tools zu öffnen). Klicke auf den "Play"-Button oben rechts, um fortzufahren. Beim Ausführen des Tests mit debugger pausiert die Ausführung - du kannst nun Variablen und Call Stack untersuchen.

Hinweis

Die Option --runInBand stellt sicher, dass Jest Tests im selben Prozess ausführt statt in separaten Prozessen. Normalerweise parallelisiert Jest Testläufe, aber gleichzeitiges Debugging mehrerer Prozesse ist schwierig.

Debugging in VS Code

Es gibt mehrere Wege, Jest-Tests mit dem integrierten Debugger von Visual Studio Code zu debuggen.

Zum Verbinden des Debuggers führe deine Tests wie zuvor aus:

node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
or on Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]

Verbinde dann den VS Code-Debugger mit dieser launch.json-Konfiguration:

{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}

Für automatisches Starten und Verbinden verwende:

{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/.bin/jest",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

Oder für Windows:

{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

Bei Verwendung von Facebooks create-react-app debugge Jest-Tests mit:

{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": [
"test",
"--runInBand",
"--no-cache",
"--env=jsdom",
"--watchAll=false"
],
"cwd": "${workspaceRoot}",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

Mehr Informationen zum Node-Debugging findest du hier.

Debugging in WebStorm

WebStorm bietet integrierte Jest-Unterstützung. Lerne mehr unter Testing With Jest in WebStorm.

Caching-Probleme

Wurde das Transform-Skript geändert oder Babel aktualisiert, ohne dass Jest die Änderungen erkennt?

Versuche es mit --no-cache. Jest cacht transformierte Module zur Beschleunigung. Bei eigenen Transforms füge eine getCacheKey-Funktion hinzu: Beispiel in Relay.

Unerfüllte Promises

Wenn ein Promise nie erfüllt wird, kann dieser Fehler auftreten:

- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Ursache sind oft konfligierende Promise-Implementierungen. Ersetze die globale Promise-Implementierung z.B. mit globalThis.Promise = jest.requireActual('promise'); oder vereinheitliche die Promise-Bibliotheken.

Bei langlaufenden Tests erhöhe das Timeout mit jest.setTimeout.

jest.setTimeout(10_000); // 10 second timeout

Probleme mit Watchman

Versuche, Jest mit --no-watchman auszuführen oder setze die watchman-Konfigurationsoption auf false.

Siehe auch die Watchman-Problembehandlung.

Tests sind extrem langsam auf Docker und/oder Continuous Integration (CI)-Servern

Obwohl Jest meist extrem schnell auf modernen Multi-Core-Computern mit schnellen SSDs läuft, kann es bei bestimmten Setups langsam sein, wie unsere Nutzer herausfanden und feststellten.

Basierend auf diesen Erkenntnissen kann die Ausführungsgeschwindigkeit um bis zu 50% verbessert werden, indem Tests sequenziell ausgeführt werden.

Verwende dazu --runInBand, um Tests im selben Thread auszuführen:

# Using Jest CLI
jest --runInBand

# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --runInBand

Eine weitere Möglichkeit zur Beschleunigung auf CI-Servern wie Travis-CI ist, die maximale Worker-Pool-Größe auf ~4 zu setzen. Auf Travis-CI kann dies die Testlaufzeit halbieren. Hinweis: Der kostenlose Travis-CI-Plan für Open-Source-Projekte bietet nur 2 CPU-Kerne.

# Using Jest CLI
jest --maxWorkers=4

# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --maxWorkers=4

Bei GitHub Actions kannst du github-actions-cpu-cores verwenden, um die CPU-Anzahl zu ermitteln und an Jest zu übergeben.

- name: Get number of CPU cores
id: cpu-cores
uses: SimenB/github-actions-cpu-cores@v2
- name: run tests
run: yarn jest --max-workers ${{ steps.cpu-cores.outputs.count }}

Alternativ kannst du mit dem shard-Flag Testläufe über mehrere Maschinen parallelisieren.

coveragePathIgnorePatterns scheint keine Wirkung zu haben

Stelle sicher, dass du nicht das babel-plugin-istanbul-Plugin verwendest. Jest kapselt Istanbul und steuert dessen Instrumentierung. Bei babel-plugin-istanbul enthält jede Babel-verarbeitete Datei Coverage-Code und wird daher nicht durch coveragePathIgnorePatterns ignoriert.

Tests definieren

Tests müssen synchron definiert werden, damit Jest sie erfassen kann.

Stell dir zur Veranschaulichung vor, wir schreiben einen Test wie diesen:

// Don't do this it will not work
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);

Wenn Jest deine Tests sammelt, findet es keine test-Aufrufe, da die Definition asynchron im nächsten Event-Loop-Tick erfolgt. Bei Verwendung von test.each darf die Tabelle daher nicht asynchron in beforeEach/beforeAll gesetzt werden.

Immer noch nicht gelöst?

Siehe Hilfe.