Vai al contenuto principale
{ "message": "Versione: 30.0", "description": "" }

Risoluzione dei problemi

Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

Oh oh, qualcosa è andato storto? Utilizza questa guida per risolvere i problemi con Jest.

I test falliscono e non sai perché

Prova a utilizzare il supporto per il debugging integrato in Node. Inserisci un'istruzione debugger; in uno dei tuoi test, quindi, nella directory del progetto, esegui:

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]

Questo eseguirà Jest in un processo Node a cui un debugger esterno può connettersi. Nota che il processo si metterà in pausa finché il debugger non si è connesso.

Per eseguire il debug in Google Chrome (o in qualsiasi browser basato su Chromium), apri il browser e vai a chrome://inspect e clicca su "Open Dedicated DevTools for Node", che ti mostrerà un elenco delle istanze Node disponibili a cui puoi connetterti. Clicca sull'indirizzo visualizzato nel terminale (di solito qualcosa come localhost:9229) dopo aver eseguito il comando precedente, e sarai in grado di eseguire il debug di Jest utilizzando i DevTools di Chrome.

Verranno visualizzati i Chrome Developer Tools e verrà impostato un breakpoint alla prima linea dello script CLI di Jest (questo viene fatto per darti il tempo di aprire gli strumenti di sviluppo e per impedire che Jest venga eseguito prima che tu abbia il tempo di farlo). Clicca sul pulsante che assomiglia a un pulsante "play" nell'angolo in alto a destra dello schermo per continuare l'esecuzione. Quando Jest esegue il test che contiene l'istruzione debugger, l'esecuzione si metterà in pausa e potrai esaminare lo scope corrente e la call stack.

nota

L'opzione CLI --runInBand assicura che Jest esegua il test nello stesso processo invece di generare processi per singoli test. Normalmente Jest parallelizza l'esecuzione dei test tra processi, ma è difficile eseguire il debug di molti processi contemporaneamente.

Debug in VS Code

Esistono diversi modi per eseguire il debug dei test Jest con il debugger integrato in Visual Studio Code.

Per collegare il debugger integrato, esegui i test come precedentemente indicato:

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]

Quindi collega il debugger di VS Code utilizzando la seguente configurazione launch.json:

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

Per avviare automaticamente e collegarti a un processo che esegue i tuoi test, utilizza la seguente configurazione:

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

oppure la seguente per 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"
}
]
}

Se stai utilizzando create-react-app di Facebook, puoi eseguire il debug dei tuoi test Jest con la seguente configurazione:

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

Ulteriori informazioni sul debug in Node sono disponibili qui.

Debug in WebStorm

WebStorm ha il supporto integrato per Jest. Leggi Testing With Jest in WebStorm per saperne di più.

Problemi di caching

Lo script di trasformazione è stato modificato o Babel è stato aggiornato e le modifiche non vengono riconosciute da Jest?

Riprova con --no-cache. Jest memorizza nella cache i file dei moduli trasformati per velocizzare l'esecuzione dei test. Se stai utilizzando un transformer personalizzato, considera di aggiungervi una funzione getCacheKey: getCacheKey in Relay.

Promise non risolte

Se una promise non viene risolta affatto, potrebbe essere generato questo errore:

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

Il più delle volte questo è causato da implementazioni Promise in conflitto. Considera di sostituire l'implementazione globale della promise con la tua, ad esempio globalThis.Promise = jest.requireActual('promise'); e/o di consolidare le librerie Promise utilizzate in una sola.

Se il tuo test è di lunga durata, potresti considerare di aumentare il timeout chiamando jest.setTimeout

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

Problemi con Watchman

Prova a eseguire Jest con l'opzione --no-watchman oppure imposta l'opzione di configurazione watchman su false.

Consulta anche la guida alla risoluzione dei problemi di Watchman.

I test sono estremamente lenti su Docker e/o server di Continuous Integration (CI)

Sebbene Jest sia solitamente velocissimo su computer multi-core moderni con SSD rapidi, potrebbe risultare lento su alcune configurazioni, come hanno riscontrato i nostri utenti.

In base alle osservazioni, un approccio per mitigare il problema e migliorare le prestazioni fino al 50% è eseguire i test in sequenza.

Per farlo, puoi utilizzare --runInBand per eseguire i test nello stesso thread:

# Using Jest CLI
jest --runInBand

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

Un'altra alternativa per accelerare i test su server CI come Travis-CI è impostare il pool massimo di worker a circa 4. Su Travis-CI ciò può dimezzare i tempi di esecuzione. Nota: il piano gratuito Travis CI per progetti open source include solo 2 core CPU.

# Using Jest CLI
jest --maxWorkers=4

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

Se usi GitHub Actions, puoi utilizzare github-actions-cpu-cores per rilevare il numero di CPU e passarlo a 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 }}

Un altro approccio è usare il flag shard per parallelizzare l'esecuzione su più macchine.

coveragePathIgnorePatterns sembra non avere effetto

Verifica di non utilizzare il plugin babel-plugin-istanbul. Jest integra Istanbul e gestisce autonomamente quali file strumentare per la copertura. Con babel-plugin-istanbul, ogni file processato da Babel include codice di raccolta copertura, ignorando così coveragePathIgnorePatterns.

Definizione dei test

I test devono essere definiti in modo sincrono affinché Jest possa raccoglierli.

Per illustrare il motivo, immagina di scrivere un test così:

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

Quando Jest cerca i test per raccoglierli, non ne troverà perché la definizione avviene in modo asincrono al ciclo successivo. Ciò significa che con test.each non puoi impostare la tabella in modo asincrono dentro beforeEach/beforeAll.

Ancora irrisolto?

Consulta la sezione Aiuto.