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.

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

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