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?
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!
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"
}
}
],
};
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.
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
.
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
Vous pouvez également définir l'env de test dans votre fichier de test comme suit:
/* eslint-env jest */
describe(() => {
...
})
Dans votre .fichier eslintignore ajoutez la valeur suivante:
**/__tests__/
Cela devrait ignorer toutes les instances du répertoire__ tests _ _ et leurs enfants.