web-dev-qa-db-fra.com

Comment utiliser ESLint avec Jest

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

Les tests de plaisanterie fonctionnent avec des globaux comme jest, sur lesquels je devrai parler au linter; mais la difficulté réside dans la structure des répertoires. Avec Jest, les tests sont intégrés au code source dans les dossiers __tests__. La structure des répertoires ressemble donc à:

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 pour ajouter les globals ... mais je ne souhaite certainement pas ajouter un fichier .eslintrc à chacun des __test__ dir.

Pour l'instant, je viens d'ajouter les paramètres globaux de test au fichier global .eslintrc, mais puisque cela signifie que je peux maintenant faire référence à jest dans du code non-test, cela ne semble pas être le "droit" Solution.

Existe-t-il un moyen de demander à eslint d’appliquer des règles basées sur un modèle basé sur le nom du répertoire, ou quelque chose du genre?

173
Retsam

Les docs montrent que vous pouvez maintenant ajouter:

"env": {
    "jest": true
}

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

J'espère que ça t'as aidé!

487
Dave Cooper

ESLint prend en charge cette version à 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"
      }
    }
  ],
};

Voici une solution de contournement (tirée d'une autre réponse ici, votez!) Pour la limitation "extension in overrides" de la configuration eslint:

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

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

50
Zachary Ryan Smith

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

/* eslint-env jest */

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

Pour compléter la réponse de Zachary, voici une solution de contournement à la limitation "extension in overrides" de la configuration eslint:

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

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

11
Ricovitch

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

P.S. Dans la prochaine version d'ESLint, il y aura un environnement plaisant qui enregistrera tous les globals nécessaires.

2
Ilya Volodin

Ajouter un environnement uniquement pour le dossier __tests__

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

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

Si vous ne possédez qu'un seul dossier __tests__, cette solution est la meilleure, car elle ne couvre l'environnement que si elle est nécessaire.

Faire face à de nombreux dossiers de test

Si vous avez plus de dossiers de test (cas OP), je suggérerais quand même d'ajouter ces fichiers. Et si vous avez des tonnes de ces dossiers, vous pouvez les ajouter avec un simple 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

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
Ulysse BN

certaines des réponses supposent que vous avez installé 'eslint-plugin-jest'. Cependant, sans avoir à le faire, vous pouvez simplement le faire dans votre fichier .eslintrc, ajoutez:

  "globals": {
    "jest": true,
  }
0
Sebastian Scholle

J'ai résolu le problème REF

ajouter le fil eslint-plugin-jest et configurer votre .eslintrcfile

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