如何在Jest中使用ESLint

时间:2015-07-25 17:47:47

标签: javascript jestjs eslint

我正在尝试将ESLint linter与Jest测试框架一起使用。

Jest测试使用像jest这样的全局变量运行,我需要告诉linter;但是棘手的是目录结构,使用Jest测试嵌入了__tests__文件夹中的源代码,因此目录结构如下所示:

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

通常,我在单个目录下进行所有测试,我可以在那里添加一个.eslintrc文件来添加全局...但我当然不想添加{{1文件到每个.eslintrc目录。

现在,我刚刚将测试全局变量添加到全局__test__文件中,但由于这意味着我现在可以在非测试代码中引用.eslintrc,这似乎不是“正确”的解决方案。

有没有办法让eslint根据某些基于目录名称的模式应用规则,或类似的东西?

9 个答案:

答案 0 :(得分:434)

The docs显示您现在可以添加:

"env": {
    "jest": true
}

.eslintrc添加到您的环境中,添加所有相关内容,消除linter错误/警告。

希望有所帮助!

答案 1 :(得分:41)

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

答案 2 :(得分:13)

您还可以如下在测试文件中设置测试环境:

/* eslint-env jest */

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

答案 3 :(得分:10)

要完成Zachary的回答,这里有一个解决方法,用于"扩展覆盖" eslint config的限制:

plugins: [
    require( 'karma-jasmine' ),
    require( 'karma-chrome-launcher' ),
    require( 'karma-phantomjs-launcher' ),
    require( 'karma-remap-istanbul' ),
    require( 'angular-cli/plugins/karma' )
],

browsers: [ 'PhantomJS', 'Chrome' ],

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

答案 4 :(得分:2)

基于模式的配置计划在ESLint的2.0.0版本中发布。但是,现在,您必须创建两个单独的任务(如注释中所述)。一个用于测试,一个用于其余代码并运行它们,同时提供不同的.eslintrc文件。

P.S。 ESLint的下一个版本中会出现一个jest环境,它将注册所有必需的全局变量。

答案 5 :(得分:1)

仅为__tests__文件夹

添加环境

您可以在.eslintrc.yml文件夹中添加__tests__文件,以扩展您的基本配置:

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

如果您只有一个__tests__文件夹,那么这个解决方案是最好的,因为它只在需要的地方设置了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

的文件夹中启动此脚本

答案 6 :(得分:0)

某些答案假定您已安装“ eslint-plugin-jest”,但是无需这样做,只需在.eslintrc文件中执行此操作,然后添加:

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

答案 7 :(得分:0)

我解决了问题REF

纱线添加eslint-plugin-jest并配置您的 .eslintrc个文件

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

答案 8 :(得分:-5)

在.eslintignore文件中添加以下值:

**/__tests__/

这应该忽略__tests__目录及其子项的所有实例。