Як використовувати ESLint з Jest


254

Я намагаюся використовувати підводку ESLint із рамкою тестування Jest.

Jest тести виконуються з деякими глобальними jestвидами, про які мені потрібно розповісти лінеру; але хитра справа в структурі каталогів, за допомогою Jest тести вбудовуються у вихідний код у __tests__папках, тому структура каталогу виглядає приблизно так:

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

Як правило, я мав би всі свої тести під одним dir, і я міг би просто додати .eslintrcфайл туди, щоб додати глобалі ... але я, звичайно, не хочу додавати .eslintrcфайл у кожен окремий __test__dir.

Наразі я тільки що додав тестові глобали до глобального .eslintrcфайлу, але оскільки це означає, що я можу зараз посилатися jestна код, який не тестується, це не здається "правильним" рішенням.

Чи є спосіб отримати eslint, щоб застосувати правила, засновані на деякому шаблоні на основі імені каталогу, чи щось подібне?


1
Це трохи надто груба сила для фактичної відповіді, але у вас може бути окрема задача зв’язування, яка вручну використовує eslint-testфайл з глобусом, наприклад eslint **/__tests__/*.js -c eslint-test.yml. При цьому, я не думаю, що існує велика небезпека виходу jestабо beforeEachглобального витоку у виробничий код;)
Нік Томлін,

Відповіді:


673

Документи показують, що тепер ви можете додати:

"env": {
    "jest": true
}

До вашої, .eslintrcяка додасть до вашого оточення всі речі, пов’язані з жартами, усуваючи помилки / попередження лінійки.


27
За допомогою цього методу використання "опису" або "це" поза файлами, що відповідають шаблону ".test.js" або "__tests __ / .js", не призведе до помилок зв’язування. Чи є спосіб досягти цього?
n1ru4l

7
@ l0rin ви можете додати .eslintrcфайл, який розширює вас за замовчуванням .eslintrcу вашій __tests__папці. Якщо у вас є проблема з OP (кілька тестових папок), ви можете генерувати ті .eslintrcз шаблоном та крихітним скриптом bash (щось на кшталт ls **/__tests/ | xargs cp templates/.eslintrc)
Ulysse BN

2
пов'язане посилання тут
devonj

73

ESLint підтримує це станом на версію> = 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"
      }
    }
  ],
};

Ось вирішення (з іншої відповіді тут, проголосуйте за нього!) Для обмеження конфігурації "eslint config" обмеження "розширення в переліку":

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

Від https://github.com/eslint/eslint/isissue/8813#issuecomment-320448724


4
Дякую, це абсолютно правильне рішення цього питання, оскільки воно насправді відповідає на нього. працював на мене!
sra

1
Це чудово! При оновленні мого ESLint до версії> = 4 і додавання "files"і "env"об'єкта "overrides"в eslint.rcмене більше не доведеться турбуватися про Jest конкретного синтаксисі , що проходить запилювання поза файлів тестування.
TheDarkIn1978

1
Відмінне рішення, а також працює для інших фреймворків (жасмін), коли у вас нестандартна структура папок.
Елліот Нельсон

2
Я хлопець, який написав прийняту відповідь - ця відповідь набагато краща за мою! Хоча в той час, коли я писав свою відповідь, це був єдиний спосіб добре вирішити цю проблему.
Дейв Купер

6
ESLint тепер підтримує розширення у відмінах
Нік

21

Ви також можете встановити тестовий env у своєму тестовому файлі таким чином:

/* eslint-env jest */

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


2

Конфігурації на основі шаблону заплановані до випуску ESLint 2.0.0. Наразі, однак, вам доведеться створити два окремих завдання (про що йдеться в коментарях). Один для тестів, а інший для решти коду та запуск обох, надаючи різні файли .eslintrc.

PS У наступному випуску ESLint з'явиться радісне середовище, воно зареєструє всі необхідні глобальні ресурси.


2

Я вирішив проблему REF

Біжи

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

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

А потім додайте у свій .eslintrcфайл

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

1

Додати середовище лише для __tests__папки

Ви можете додати .eslintrc.ymlфайл у свої __tests__папки, який розширює основну конфігурацію:

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

Якщо у вас є лише одна __tests__папка, це рішення є найкращим, оскільки воно охоплює довкілля лише там, де це потрібно.

Робота з багатьма тестовими папками

Якщо у вас є більше тестових папок (корпус ОП), я все-таки пропоную додати ці файли. І якщо у вас є багато цих папок, можете додати їх простим скриптом 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

Цей скрипт шукатиме __tests__папки та додасть .eslintrc.ymlфайл із конфігурацією, показаною вище. Цей сценарій має бути запущений у папці, у якій є ваш батьків .eslintrc.


1

деякі відповіді передбачають, що у вас встановлено "eslint-plugin-jest", однак, не вимагаючи цього, ви можете просто зробити це у своєму .eslintrcфайлі, додайте:

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

-8

У свій .eslintignore файл додайте таке значення:

**/__tests__/

При цьому слід ігнорувати всі екземпляри каталогу __tests__ та їхніх дітей.


4
Це не зовсім те, що я хочу, я не хочу ігнорувати тестові файли, я все-таки хочу їх підписати, я просто хочу розібратися, як вказати необхідні параметри, щоб їх правильно змастити.
Ретсам

2
Дуже погана ідея, eslint допомагає у всьому коді - включаючи тестовий код.
Даніель Кмак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.