Hopp til hovedinnhold
Versjon: 30.0

Feilsøking

Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

Oi sann, noe gikk galt? Bruk denne veiledningen til å løse problemer med Jest.

Tester feiler, og du vet ikke hvorfor​

Prøv å bruke feilsøkingsstøtten innebygd i Node. Plasser en debugger;-setning i en av testene dine, og kjør deretter i prosjektmappen:

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]

Dette kjører Jest i en Node-prosess som en ekstern feilsøker kan koble seg til. Merk at prosessen vil pause til feilsøkeren kobler seg til.

For feilsøking i Google Chrome (eller andre Chromium-baserte nettlesere): Åpne nettleseren og gå til chrome://inspect, klikk "Open Dedicated DevTools for Node" for å se tilgjengelige Node-instanser. Klikk på terminaladressen (som regel localhost:9229) etter å ha kjørt kommandoen over, så kan du feilsøke Jest med Chrome DevTools.

Chrome Developer Tools åpnes med et stopppunkt på første linje av Jest CLI-skriptet (dette gir deg tid til å åpne verktøyene). Klikk play-knappen øverst til høyre for å fortsette. Når Jest når debugger-setningen din, pauses kjøringen og du kan inspisere scope og kallstakk.

notat

Alternativet --runInBand sikrer at Jest kjører tester i samme prosess istedenfor å starte egne prosesser. Normalt parallelliserer Jest tester, men det er vanskelig å feilsøke flere prosesser samtidig.

Feilsøking i VS Code​

Det finnes flere måter å feilsøke Jest-tester med Visual Studio Codes innebygde feilsøker.

For å koble til den innebygde feilsøkeren, kjør testene slik:

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]

Deretter kobler du til VS Code-debuggeren ved å bruke følgende launch.json-konfigurasjon:

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

For å automatisk starte og koble til en prosess som kjører testene dine, bruk følgende konfigurasjon:

{
"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"
}
]
}

eller følgende for 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"
}
]
}

Hvis du bruker Facebooks create-react-app, kan du feilsøke Jest-testene dine med følgende konfigurasjon:

{
"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"
}
]
}

Mer informasjon om feilsøking i Node finner du her.

Feilsøking i WebStorm​

WebStorm har innebygd Jest-støtte. Les Testing With Jest in WebStorm for mer informasjon.

Problemer med hurtiglager​

Endret du transform-skriptet eller oppdaterte Babel, men endringene blir ikke oppdaget av Jest?

Prøv med --no-cache. Jest bruker hurtiglager for raskere testkjøring. Med egendefinerte transformere, vurder å legge til getCacheKey: getCacheKey i Relay.

Uløste promises​

Hvis en promise aldri løses, kan denne feilen oppstå:

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

Dette skyldes vanligvis konflikt mellom Promise-implementasjoner. Erstatt den globale implementasjonen, f.eks. med globalThis.Promise = jest.requireActual('promise');, eller bruk kun ett Promise-bibliotek.

Ved langsomme tester kan du øke timeout med jest.setTimeout.

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

Problemer med Watchman​

Prøv å kjøre Jest med --no-watchman eller sett konfigurasjonsalternativet watchman til false.

Se også feilsøking for Watchman.

Tester er ekstremt trege på Docker og/eller kontinuerlig integrasjon (CI)-tjener​

Selv om Jest oftest er ekstremt rask på moderne flerkjerners maskiner med raske SSD-er, kan den være treg på enkelte oppsett som brukere har oppdaget.

Basert på funnene kan du redusere problemet og øke hastigheten med opptil 50% ved å kjøre tester sekvensielt.

For å gjøre dette kan du kjøre tester i samme tråd ved hjelp av --runInBand:

# Using Jest CLI
jest --runInBand

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

Et annet alternativ for å redusere testkjøringstid på CI-tjenere som Travis-CI er å sette maksimalt antall arbeidere til ~4. På Travis-CI kan dette halvere kjøringstiden. Merk: Travis CIs gratisplan for åpne kilder-prosjekter inkluderer kun 2 CPU-kjerner.

# Using Jest CLI
jest --maxWorkers=4

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

Hvis du bruker GitHub Actions, kan du bruke github-actions-cpu-cores for å oppdage antall prosessorer og sende dette til Jest.

- 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 }}

En annen mulighet er å bruke shard-flagget for å parallelisere testkjøringen på tvers av flere maskiner.

coveragePathIgnorePatterns ser ut til å ikke ha effekt​

Forsikre deg om at du ikke bruker babel-plugin-istanbul. Jest bruker Istanbul, og bestemmer selv hvilke filer som skal instrumenteres for dekning. Med babel-plugin-istanbul får alle Babel-prosesserte filer dekningskode, og blir dermed ikke ignorert av coveragePathIgnorePatterns.

Definere tester​

Tester må defineres synkront for at Jest skal kunne samle dem.

Tenk deg for eksempel at vi skrev en test slik:

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

Når Jest kjører testen for å samle test-ene, finner den ingen fordi definisjonen skjer asynkront på neste hendelsessyklus. Dette betyr at når du bruker test.each, kan du ikke sette tabellen asynkront i beforeEach/beforeAll.

Fremdeles problemer?​

Se Hjelp.