Come usare ESLint con Jest


254

Sto tentando di utilizzare la linter ESLint con il framework di test Jest.

I test jest vengono eseguiti con alcuni globali come jest, di cui dovrò parlare alla linter; ma la cosa difficile è la struttura delle directory, con Jest i test sono integrati con il codice sorgente nelle __tests__cartelle, quindi la struttura delle directory assomiglia a qualcosa del tipo:

src
    foo
        foo.js
        __tests__
            fooTest.js
    bar
        bar.js
        __tests__
            barTest.js

Normalmente, avrei tutti i miei test sotto una singola .eslintrcdirectory , e potrei semplicemente aggiungere un file lì per aggiungere i globi ... ma certamente non voglio aggiungere un .eslintrcfile ad ogni singola directory __test__.

Per ora, ho appena aggiunto i globi di prova al .eslintrcfile globale , ma poiché ciò significa che ora posso fare riferimento jestnel codice non di prova, questa non sembra la soluzione "giusta".

C'è un modo per ottenere eslint per applicare le regole in base a un modello basato sul nome della directory o qualcosa del genere?


1
Questa è una forza un po 'troppo bruta per una risposta effettiva, ma potresti avere un'attività di linting separata che utilizza manualmente un eslint-testfile con un glob, ad es eslint **/__tests__/*.js -c eslint-test.yml. Detto questo, non credo che ci sia molto pericolo di una jesto beforeEachglobale che perde fuori nel codice di produzione;)
Nick Tomlin

Risposte:


672

I documenti mostrano che ora puoi aggiungere:

"env": {
    "jest": true
}

Al tuo .eslintrcche aggiungerai tutte le cose relative al jest al tuo ambiente, eliminando gli errori / avvertimenti della linter.


27
Con questo metodo, l'uso di "descrivi" o "esso" al di fuori dei file che corrispondono al modello " .test.js" o "__test __ / .js" non comporterà errori di sfilacciatura. C'è un modo per raggiungere questo obiettivo?
n1ru4l

7
@ l0rin potresti aggiungere un .eslintrcfile che estende la tua impostazione predefinita .eslintrcnella tua __tests__cartella. Se hai lo stesso problema di OP (più cartelle di test), puoi generare quelli .eslintrccon un modello e un piccolo script bash (qualcosa del genere ls **/__tests/ | xargs cp templates/.eslintrc)
Ulysse BN

2
link correlato qui
Devonj

73

ESLint supporta questo dalla versione> = 4:

/*
.eslintrc.js
*/
const ERROR = 2;
const WARN = 1;

module.exports = {
  extends: "eslint:recommended",
  env: {
    es6: true
  },
  overrides: [
    {
      files: [
        "**/*.test.js"
      ],
      env: {
        jest: true // now **/*.test.js files' env has both es6 *and* jest
      },
      // Can't extend in overrides: https://github.com/eslint/eslint/issues/8813
      // "extends": ["plugin:jest/recommended"]
      plugins: ["jest"],
      rules: {
        "jest/no-disabled-tests": "warn",
        "jest/no-focused-tests": "error",
        "jest/no-identical-title": "error",
        "jest/prefer-to-have-length": "warn",
        "jest/valid-expect": "error"
      }
    }
  ],
};

Ecco una soluzione alternativa (da un'altra risposta qui, votala!) Per la limitazione "Estendi in sostituzioni" della configurazione eslint:

overrides: [
  Object.assign(
    {
      files: [ '**/*.test.js' ],
      env: { jest: true },
      plugins: [ 'jest' ],
    },
    require('eslint-plugin-jest').configs.recommended
  )
]

Da https://github.com/eslint/eslint/issues/8813#issuecomment-320448724


4
Grazie, questa è totalmente la soluzione giusta per questa domanda, in quanto risponde effettivamente. ha funzionato per me!
sabato

1
Questo è fantastico! Con l'aggiornamento di ESLint alla versione> = 4 e l'aggiunta di a "files"e "env"object "overrides"in eslint.rcnon devo più preoccuparmi della sintassi specifica di Jest che passa la lanugine al di fuori dei file di test.
TheDarkIn1978,

1
Ottima soluzione e funziona anche per altri framework (jasmine) quando si dispone di una struttura di cartelle non standard.
Elliot Nelson,

2
Sono il ragazzo che ha scritto la risposta accettata - questa risposta è molto meglio della mia! Anche se al momento ho scritto la mia risposta, era l'unico modo per risolvere bene questo problema.
Dave Cooper,

6
ESLint ora supporta l'estensione nelle sostituzioni
Nick McCurdy,

21

È inoltre possibile impostare il test env nel file di test come segue:

/* eslint-env jest */

describe(() => {
  /* ... */
})


2

Le configurazioni basate su pattern sono pianificate per la versione 2.0.0 di ESLint. Per ora, tuttavia, dovrai creare due attività separate (come indicato nei commenti). Uno per i test e uno per il resto del codice ed eseguirli entrambi, fornendo al contempo diversi file .eslintrc.

PS C'è un ambiente scherzoso nella prossima versione di ESLint, registrerà tutti i globi necessari.


2

Ho risolto il problema RIF

Correre

# For Yarn
yarn add eslint-plugin-jest -D

# For NPM
npm i eslint-plugin-jest -D

E quindi aggiungi il tuo .eslintrcfile

{
    "extends": ["airbnb","plugin:jest/recommended"],
}

1

Aggiungi ambiente solo per __tests__cartella

È possibile aggiungere un .eslintrc.ymlfile nelle __tests__cartelle, che estende la configurazione di base:

extends: <relative_path to .eslintrc>
env:
    jest: true

Se si dispone di una sola __tests__cartella, questa soluzione è la migliore in quanto si trova nell'ambiente jest solo dove è necessaria.

Gestire molte cartelle di prova

Se hai più cartelle di prova (caso OP), suggerirei comunque di aggiungere quei file. E se hai tonnellate di quelle cartelle puoi aggiungerle con un semplice script zsh:

#!/usr/bin/env zsh

for folder in **/__tests__/ ;do
    count=$(($(tr -cd '/' <<< $folder | wc -c)))
    echo $folder : $count
    cat <<EOF > $folder.eslintrc.yml
extends: $(printf '../%.0s' {1..$count}).eslintrc
env:
    jest: true
EOF
done

Questo script cercherà le __tests__cartelle e aggiungerà un .eslintrc.ymlfile alla configurazione mostrata sopra. Questo script deve essere avviato nella cartella contenente il tuo genitore .eslintrc.


1

alcune delle risposte suppongono che tu abbia installato 'eslint-plugin-jest', tuttavia senza che tu debba farlo, puoi semplicemente farlo nel tuo .eslintrcfile, aggiungere:

  "globals": {
    "jest": true,
  }

-8

Nel tuo file .eslintignore aggiungi il seguente valore:

**/__tests__/

Questo dovrebbe ignorare tutte le istanze della directory __tests__ e i loro figli.


4
Non è proprio quello che voglio, non voglio ignorare i file di test, voglio ancora sfilarli, voglio solo capire come specificare le opzioni necessarie per sfilarli correttamente.
Retsam,

2
Pessima idea, eslint aiuta in tutto il codice, incluso il codice di prova.
Daniel Kmak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.