我试图使用ESLint linter与Jest测试框架。

Jest测试与一些全局变量(如Jest)一起运行,我需要告诉linter;但棘手的是目录结构,在Jest中,测试与源代码一起嵌入在__tests__文件夹中,因此目录结构看起来像这样:

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

通常,我将所有的测试都放在一个目录下,我可以在那里添加一个.eslintrc文件来添加全局变量…但我当然不想在每个__test__目录下都添加一个.eslintrc文件。

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

是否有一种方法让eslint应用基于目录名或类似内容的模式的规则?


当前回答

从2021年开始,我认为正确的方法或者至少是有效的方法是安装@types/jest和eslint-plugin-jest:

npm i -D eslint-plugin-jest @types/jest

用@Loren提到的overrides指令将Jest插件添加到.eslintrc.js中:

module.exports = {
  ...
  plugins: ["jest"],
  ...
  overrides: [
    {
      files: ["**/*.test.js"],
      env: { "jest/globals": true },
      plugins: ["jest"],
      extends: ["plugin:jest/recommended"],
    },
  ],
  ...
};

通过这种方式,您可以在源文件和测试文件中得到检测错误,但在测试文件中,您不会得到test和其他Jest函数的检测错误,但您将在源文件中得到它们,因为它们在那里显示为未定义。

其他回答

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

**/__tests__/

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

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

/* eslint-env jest */

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

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

附:在ESLint的下一个版本中会有一个笑话环境,它会注册所有必要的全局变量。

在花了一段时间尝试不同的选择后,我让它运行起来了。希望这能帮助其他陷入困境的人。

.eslintrc.json(在项目根文件夹中):

{
    "env": {
        "browser": true,
        "es2021": true,
        "jest/globals": true
    },
    "extends": [
        "standard",
        "plugin:jest/all"
    ],
    "parser": "@babel/eslint-parser",
    "parserOptions": {
        "ecmaVersion": 12,
        "sourceType": "module"
    },
    "rules": {
        "jest/no-hooks": [
            "error",
            {
                "allow": [
                    "afterEach",
                    "beforeEach"
                ]
            }
        ]
    },
    "plugins": [
        "jest"
    ]
}

空的.babelrc(在根项目文件夹中):

{}

.package。Json(在项目根文件夹):

{
  "scripts": {
    "test": "jest",
    "lint": "npx eslint --format=table .",
    "lintfix": "npx eslint --fix ."
  },
  "devDependencies": {
    "@babel/core": "^7.15.0",
    "@babel/eslint-parser": "^7.15.0",
    "aws-sdk-mock": "^5.2.1",
    "eslint": "^7.32.0",
    "eslint-config-standard": "^16.0.3",
    "eslint-plugin-import": "^2.24.0",
    "eslint-plugin-jest": "^24.4.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.1.0",
    "jest": "^27.0.6"
  }
}

VS Code settings.xml(编辑器配置:启用自动修复保存+ babel解析器):

    "eslint.alwaysShowStatus": true,
    "eslint.format.enable": true,
    "eslint.lintTask.enable": true,
    "eslint.options": {
        "parser": "@babel/eslint-parser"
    },
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },
    "eslint.validate": [
        "javascript"
    ]

REF,我解决了这个问题

Run

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

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

然后添加你的.eslintrc文件

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