Comment utiliser ESLint avec Jest

J'essaie d'utiliser le linter ESLint avec le framework de test Jest.

Les tests Jest s'exécutent avec des globals comme jest, dont je devrai parler au linter; mais la chose délicate est la structure du répertoire, avec Jest les tests sont intégrés avec le code source dans les dossiers __tests__, donc la structure du répertoire ressemble à quelque chose comme:

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

Normalement, j'aurais tous mes tests sous un seul répertoire, et je pourrais simplement ajouter un fichier .eslintrc là pour ajouter les globals... mais je Je ne veux certainement pas ajouter un fichier .eslintrc à chaque répertoire __test__.

Pour l'instant, je viens d'ajouter les globals de test au fichier global .eslintrc, mais puisque cela signifie que je peux maintenant référencer jest dans le code non-test, cela ne semble pas être la" bonne " solution.

Existe-t-il un moyen d'obtenir qu'eslint applique des règles basées sur un modèle basé sur le nom du répertoire, ou quelque chose comme ça?

103
demandé sur Retsam 2015-07-25 20:47:46

7 réponses

Les documents montrent que vous pouvez maintenant ajouter:

"env": {
    "jest": true
}

À votre .eslintrc qui ajoutera toutes les choses liées à la plaisanterie à votre environnement, éliminant les erreurs/avertissements linter.

Espérons que cela aide!

302
répondu Dave Cooper 2018-03-01 12:11:57

ESLint prend en charge cela à partir de la version > = 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"
      }
    }
  ],
};
23
répondu Zachary Ryan Smith 2018-06-15 01:46:55

Les configurations basées sur un motif sont planifiées pour la version 2.0.0 D'ESLint. Pour l'instant, cependant, vous devrez créer deux tâches distinctes (comme mentionné dans les commentaires). Un pour les tests et un pour le reste du code et exécutez les deux, tout en fournissant différent .fichiers eslintrc.

P.S. il y a un environnement jest à venir dans la prochaine version D'ESLint, il enregistrera tous les globals nécessaires.

2
répondu Ilya Volodin 2015-07-31 22:01:16

Ajouter un environnement uniquement pour le dossier __tests__

Vous pouvez ajouter un fichier .eslintrc.yml dans vos dossiers __tests__, qui vous étend la configuration de base:

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

Si vous n'avez qu'un seul dossier __tests__, Cette solution est la meilleure car elle ne couvre l'environnement jest que là où elle est nécessaire.

Traiter de nombreux dossiers de test

Si vous avez plus de dossiers de test (cas OPs), je suggérerais toujours d'ajouter ces fichiers. Et si vous avez des tonnes de ces dossiers peuvent les ajouter avec un simple zsh script:

#!/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

Ce script recherchera les dossiers __tests__ et ajoutera un fichier .eslintrc.yml avec la configuration indiquée ci-dessus. Ce script doit être lancé dans le dossier contenant votre parent .eslintrc.

1
répondu Ulysse BN 2017-07-22 19:49:21

Pour compléter la réponse de Zachary, voici une solution de contournement pour la limitation "extend in overrides" de ESLint config:

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

À Partir de https://github.com/eslint/eslint/issues/8813#issuecomment-320448724

1
répondu Ricovitch 2018-04-25 10:15:15

Vous pouvez également définir l'env de test dans votre fichier de test comme suit:

/* eslint-env jest */

describe(() => {
  ...
})
0
répondu HaNdTriX 2018-09-30 07:59:43

Dans votre .fichier eslintignore ajoutez la valeur suivante:

**/__tests__/

Cela devrait ignorer toutes les instances du répertoire__ tests _ _ et leurs enfants.

-5
répondu Jason Shimkoski 2015-07-27 19:34:20