Jak korzystać z ESLint z Jest

252

Próbuję użyć linera ESLint z ramą testową Jest.

Są testy przeprowadzane z niektórymi globalsami jest, o których muszę powiedzieć liniowiec; ale trudną rzeczą jest struktura katalogów, w przypadku Jest testy są osadzone z kodem źródłowym w __tests__folderach, więc struktura katalogów wygląda mniej więcej tak:

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

Normalnie miałbym wszystkie moje testy pod jednym katalogiem i mógłbym po prostu dodać .eslintrctam plik, aby dodać globały ... ale z pewnością nie chcę dodawać .eslintrcpliku do każdego katalogu __test__.

Na razie właśnie dodałem globalne testy do .eslintrcpliku globalnego , ale ponieważ oznacza to, że mogę teraz odwoływać się jestdo kodu nie testującego, nie wydaje się to „właściwym” rozwiązaniem.

Czy istnieje sposób na to, aby eslint stosował reguły oparte na pewnym wzorcu opartym na nazwie katalogu lub coś w tym rodzaju?

Retsam
źródło
1
Jest to nieco zbyt brutalna siła dla faktycznej odpowiedzi, ale możesz mieć oddzielne zadanie szarpania, które ręcznie wykorzystuje eslint-testplik z globusem, np eslint **/__tests__/*.js -c eslint-test.yml. Powiedział, że nie sądzę, istnieje wiele niebezpieczeństwo jestlub beforeEachglobalny wycieka do kodu produkcyjnego;)
Nick Tomlin

Odpowiedzi:

669

Dokumenty pokazują, że możesz teraz dodawać:

"env": {
    "jest": true
}

Do twojego, .eslintrcktóry doda wszystkie związane z żartem rzeczy do twojego środowiska, eliminując błędy / ostrzeżenia lintera.

Dave Cooper
źródło
27
Dzięki tej metodzie użycie „opisz” lub „to” poza plikami, które pasują do wzorca „.test.js” lub „__tests __ / .js”, nie spowoduje błędów w przycinaniu. Czy jest jakiś sposób na osiągnięcie tego?
n1ru4l
7
@ l0rin możesz dodać .eslintrcplik, który rozszerza domyślnie .eslintrcw swoim __tests__folderze. Jeśli masz taki sam problem jak OP (wiele folderów testowych), możesz wygenerować je .eslintrcza pomocą szablonu i małego skryptu bash (coś podobnego ls **/__tests/ | xargs cp templates/.eslintrc)
Ulysse BN
2
powiązany link tutaj
devonj
73

ESLint obsługuje to od wersji> = 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"
      }
    }
  ],
};

Oto obejście (z innej odpowiedzi tutaj, głosuj w górę!) Ograniczenia „przedłużenia nadpisania” konfiguracji eslint:

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

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

Zachary Ryan Smith
źródło
4
Dziękuję, to jest całkowicie właściwe rozwiązanie tego pytania, ponieważ faktycznie na nie odpowiada. pracował dla mnie!
sra
1
To jest świetne! Z aktualizacją mojego ESLint do wersji> = 4 i dodanie "files"i "env"obiekt do "overrides"w eslint.rcI już nie trzeba się martwić o specyficznej składni przechodzącej żartem strzępienia poza plików testowych.
TheDarkIn1978
1
Doskonałe rozwiązanie, a także działa na inne frameworki (jaśmin), gdy masz niestandardową strukturę folderów.
Elliot Nelson
2
Jestem facetem, który napisał zaakceptowaną odpowiedź - ta odpowiedź jest znacznie lepsza niż moja! Chociaż w tym czasie pisałem odpowiedź, był to jedyny sposób na dobre rozwiązanie tego problemu.
Dave Cooper
6
ESLint obsługuje teraz rozszerzanie w przesłonięciach
Nick McCurdy,
21

Możesz również ustawić env testowy w pliku testowym w następujący sposób:

/* eslint-env jest */

describe(() => {
  /* ... */
})
HaNdTriX
źródło
13

Aby uzupełnić odpowiedź Zachary'ego, oto obejście dla ograniczenia „przedłużenia nadpisania” konfiguracji eslint:

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

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

Ricovitch
źródło
2

Konfiguracje oparte na wzorcach są zaplanowane na wydanie 2.0.0 ESLint. Na razie jednak będziesz musiał utworzyć dwa oddzielne zadania (jak wspomniano w komentarzach). Jeden do testów, drugi do reszty kodu i uruchom oba z nich, zapewniając różne pliki .eslintrc.

PS W następnym wydaniu ESLint pojawi się środowisko żartów, które zarejestruje wszystkie niezbędne globale.

Ilya Volodin
źródło
2

Rozwiązałem problem REF

Biegać

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

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

A następnie dodaj swój .eslintrcplik

{
    "extends": ["airbnb","plugin:jest/recommended"],
}
Brance Lee
źródło
1

Dodaj środowisko tylko dla __tests__folderu

Możesz dodać .eslintrc.ymlplik do __tests__folderów, który rozszerza podstawową konfigurację:

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

Jeśli masz tylko jeden __tests__folder, to rozwiązanie jest najlepsze, ponieważ obejmuje środowisko tylko tam, gdzie jest potrzebne.

Radzenie sobie z wieloma folderami testowymi

Jeśli masz więcej folderów testowych (przypadek OP), nadal sugeruję dodanie tych plików. A jeśli masz mnóstwo tych folderów, możesz dodać je za pomocą prostego skryptu 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

Ten skrypt wyszuka __tests__foldery i doda .eslintrc.ymlplik do konfiguracji pokazanej powyżej. Ten skrypt musi być uruchomiony w folderze zawierającym twojego rodzica .eslintrc.

Ulysse BN
źródło
1

niektóre odpowiedzi zakładają, że masz zainstalowaną „eslint-plugin-jest”, jednak bez potrzeby możesz to zrobić w .eslintrcpliku i dodać:

  "globals": {
    "jest": true,
  }
Sebastian Scholle
źródło
-8

W pliku .eslintignore dodaj następującą wartość:

**/__tests__/

To powinno zignorować wszystkie wystąpienia katalogu __tests__ i ich dzieci.

Jason Shimkoski
źródło
4
Nie jest to dokładnie to, czego chcę, nie chcę ignorować plików testowych, nadal chcę je strzępić, chcę tylko dowiedzieć się, jak określić niezbędne opcje, aby je poprawnie zostawić.
Retsam
2
Bardzo zły pomysł, eslint pomaga w każdym kodzie - w tym w kodzie testowym.
Daniel Kmak,