Как использовать ESLint с Jest

Я пытаюсь использовать линтер ESLint со средой тестирования Jest.

Jest-тесты запускаются с некоторыми глобальными переменными, такими как jest, о которых мне нужно сообщить линтеру; но сложность заключается в структуре каталогов, с Jest тесты встраиваются вместе с исходным кодом в __tests__ папки, поэтому структура каталогов выглядит примерно так:

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

Обычно у меня были бы все мои тесты в одном каталоге, и я мог бы просто добавить туда .eslintrc файл, чтобы добавить глобальные объекты ... но я определенно не хочу добавлять .eslintrc файл в каждый __test__ каталог.

На данный момент я только что добавил тестовые глобальные переменные в глобальный .eslintrc файл, но поскольку это означает, что теперь я могу ссылаться на jest в не тестирующем коде, это не похоже на «правильное» решение.

Есть ли способ заставить eslint применять правила на основе некоторого шаблона на основе имени каталога или чего-то в этом роде?


person Retsam    schedule 25.07.2015    source источник
comment
Это слишком грубая сила для фактического ответа, но у вас может быть отдельная задача линтинга, которая вручную использует файлeslint-test с глобусом, например eslint **/__tests__/*.js -c eslint-test.yml. Тем не менее, я не думаю, что существует большая опасность jest или beforeEach глобальной утечки в производственный код;)   -  person Nick Tomlin    schedule 27.07.2015


Ответы (9)


Документы показывают, что теперь вы можете добавлять:

"env": {
    "jest/globals": true
}

К вашему .eslintrc, который добавит все связанные с шутками вещи в вашу среду, исключив ошибки / предупреждения линтера.

person Dave Cooper    schedule 26.10.2016
comment
В этом методе использование описания или его вне файлов, соответствующих шаблону .test.js или __tests __ / .js, не приведет к ошибкам линтинга. Есть ли способ добиться этого? - person n1ru4l; 09.05.2017
comment
@ l0rin вы можете добавить .eslintrc файл, который расширяет ваш .eslintrc по умолчанию в вашу __tests__ папку. Если у вас та же проблема, что и у OP (несколько тестовых папок), вы можете сгенерировать эти .eslintrc с помощью шаблона и крошечного сценария bash (что-то вродеls **/__tests/ | xargs cp templates/.eslintrc) - person Ulysse BN; 22.07.2017
comment
соответствующая ссылка здесь - person devonj; 25.01.2018
comment
Это все еще верно? В документах конкретно указано "jest/globals": true, а не "jest": true. - person Kevin Ghadyani; 21.09.2020
comment
@Sawtaytoes хорошее место. Я соответственно обновил ответ :) - person Dave Cooper; 22.09.2020

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:

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

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

person Zachary Ryan Smith    schedule 10.03.2018
comment
Спасибо, это совершенно правильное решение этого вопроса, поскольку оно на самом деле отвечает на него. у меня сработало! - person sra; 21.03.2018
comment
Отлично! С обновлением моего ESLint до версии ›= 4 и добавлением объектов "files" и "env" в "overrides" в eslint.rc мне больше не нужно беспокоиться о специфическом синтаксисе Jest, передающем линтинг вне тестовых файлов. - person Chunky Chunk; 15.06.2018
comment
Отличное решение, а также работает для других фреймворков (жасмин), когда у вас нестандартная структура папок. - person Elliot Nelson; 24.12.2018
comment
Я тот парень, который написал принятый ответ - этот ответ намного лучше моего! Хотя в то время, когда я писал свой ответ, это был единственный способ решить эту проблему. - person Dave Cooper; 17.05.2019
comment
ESLint теперь поддерживает расширение в переопределениях - person Nick McCurdy; 08.11.2019

Вы также можете установить тестовый env в своем тестовом файле следующим образом:

/* eslint-env jest */

describe(() => {
  /* ... */
})
person HaNdTriX    schedule 30.09.2018

Чтобы завершить ответ Захари, вот обходной путь для ограничения «расширять переопределения» конфигурации eslint:

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

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

person Ricovitch    schedule 25.04.2018

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

Запустить

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

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

А затем добавьте в свой .eslintrc файл

{
    "extends": ["airbnb","plugin:jest/recommended"],
}
person Brance Lee    schedule 14.08.2019

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

P.S. В следующем выпуске ESLint появится среда для шуток, в которой будут зарегистрированы все необходимые глобальные переменные.

person Ilya Volodin    schedule 31.07.2015

некоторые ответы предполагают, что у вас установлен eslint-plugin-jest, однако без необходимости этого вы можете просто сделать это в своем .eslintrc файле, добавить:

  "globals": {
    "jest": true,
  }
person Sebastian Scholle    schedule 02.08.2019

Добавить среду только для __tests__ папки

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

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

Если у вас только одна __tests__folder, это решение является лучшим, поскольку оно охватывает среду jest только там, где это необходимо.

Работа с множеством тестовых папок

Если у вас есть больше тестовых папок (случай OP), я все равно предлагаю добавить эти файлы. И если у вас есть масса этих папок, вы можете добавить их с помощью простого скрипта 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.

person Ulysse BN    schedule 22.07.2017

В вашем файле .eslintignore добавьте следующее значение:

**/__tests__/

Это должно игнорировать все экземпляры каталога __tests__ и их дочерние элементы.

person Jason Shimkoski    schedule 26.07.2015
comment
Это не совсем то, что я хочу, я не хочу игнорировать тестовые файлы, я все еще хочу их линтировать, я просто хочу выяснить, как указать необходимые параметры для их правильного линтинга. - person Retsam; 26.07.2015
comment
Очень плохая идея, eslint помогает во всем коде, включая тестовый код. - person Daniel Kmak; 13.03.2018