【问题标题】:Nice way to get rid of no-unused-expressions linter error with chai用 chai 摆脱 no-unused-expressions linter 错误的好方法
【发布时间】:2016-09-30 05:44:22
【问题描述】:

在我的 Chai 测试中,我经常发现自己想使用他们的断言,例如 .to.be.empty.to.be.true 等,因为我发现它们比 .to.be.length(1).to.be.equal(true) 更易于阅读。但是,这会破坏我的 linter(我使用的是默认的 Airbnb linting)。

我可以使用// disable-eslint-line 语法,但是我必须将它添加到每一行中,这样看起来很乏味。

我还阅读了有关 DirtyChai 库的信息,但这需要我返回整个测试库,为它们添加括号,这似乎是我不应该仅仅为了让我的 linter 做的事情首先通过一些它可能应该没问题的东西。

有没有人知道比我上面概述的方法更好的方法来处理这个问题?

【问题讨论】:

  • 明确地说,Chai 所做的应该被视为一个错误。

标签: chai eslint


【解决方案1】:

您可以使用相关文件顶部的eslint-disable 禁用整个文件的规则:

/* eslint-disable no-unused-expressions */
expect(someTrueValue).to.be.true; 

但是,将其添加到每个测试文件的顶部可能会很乏味。要对所有相关文件禁用此规则,您可以:

  1. 将新的.eslintc configuration file 放在与测试文件相同的目录中,配置为禁用该规则。这允许您对所有其他规则使用默认配置,同时仅针对该文件夹中的文件忽略该规则。 ESLint 称之为Configuration Cascading

    {
        "rules": {
            "no-unused-expressions": "off"
        }
    }
    
  2. 使用主.eslintrc 文件中的overrides 键与全局模式匹配的disable rules for groups of files

    {
        "overrides": [
            {
                "files": ["*.test.js", "*.spec.js"],
                "rules": {
                    "no-unused-expressions": "off"
                }
            }
        ]
    }
    

这还允许您禁用其他在测试中变得麻烦的规则,例如使用rewire时的no-underscore-dangle

【讨论】:

  • 这是一个非常酷的功能(配置级联)我不知道 eslint 谢谢!不是我想要的完美解决方案,因为我希望它只关心那些特定的用例,但足以满足我想要做的事情。
  • 为什么这个答案是关于no-underscore-dangle?你能解释一下在 .eslintrc 中加入什么来回答 op 的原始问题吗?
【解决方案2】:

我制作了一个名为eslint-plugin-chai-friendly 的小型plugin,它覆盖了默认的no-unused-expressions 规则并使其对chai 友好。修改后的规则会忽略 expectshould 语句,同时保留其他所有内容的默认行为。

【讨论】:

  • +1。这应该是公认的答案,因为这意味着您不必关闭整个测试文件的规则(因此,当它适用时,您仍然可以获得规则的好处)。感谢插件!
  • 如果你正在编写 typescript,现在 npm 上有一个用于 tslint 的等效插件:tslint-no-unused-expression-chai
【解决方案3】:

刚刚找到另一个使用Relative Glob Patterns的选项:

在您的.eslintrc 文件中:

overrides: [
    {
        files: "*.test.js",
        rules: {
          "no-unused-expressions": "off"
        }
    }
]

【讨论】:

    【解决方案4】:

    jonalvarezz's answerIhor Diachenko's answer 结合起来正是我想要的:

    npm install --save-dev eslint-plugin-chai-friendly

    // .eslintrc.js
    module.exports = {
      // ...
      plugins: ['chai-friendly'],
      overrides: [{
        files: '*.test.js',
        rules: {
          'no-unused-expressions': 'off',
          'chai-friendly/no-unused-expressions': 'error',
        },
      }],
      // ...
    }
    

    这样,no-unused-expression 规则只会在*.test.js 文件中被覆盖 和 no-unused-expression 规则仍然存在,以捕获测试文件中与 chai 无关的任何未使用的表达式。

    【讨论】:

    • 好主意。不应该启用代码示例中的第二条规则吗?一世。 e. 'chai-friendly/no-unused-expressions': 2
    • 你是对的。我回顾了我的代码,我将其命名为chai-friendly/no-unused-expressions': 'error'。随意提交修改,否则我会在几天内完成。
    【解决方案5】:

    如果今天有人偶然发现这个问题,我遇到了同样的问题,并在eslint documentation 上找到了这个解决方案。在您的 eslint 配置文件中,您可以指定一个或多个环境,这将为该环​​境预定义全局变量。对我们来说,它是mocha,您可以在.eslintrc.json 中进行这样的配置:

    {
        "env": {
            "mocha": true
        },
        ...
        ...
        ...
    }
    

    因此,它将消除所有关于 mocha describeitbeforeEach 等的误报,而无需完全禁用 eslint 或完全禁用任何特定规则。

    用 ESLint v.4.11 和 mocha 5.0 测试

    【讨论】:

    • 这是正确的做法。根据我的经验,Chai 断言仍然会失败,因为 Chai 和 Mocha 是两个不同的东西,所以你想分别处理它。 Scott 的上述回答似乎是 Chai 最有效的解决方法。
    • 这没有回答问题,这是关于 Chai 的 should()assert 方法的问题。
    【解决方案6】:

    我在使用 tslint 时遇到了这个问题,只需将未使用表达式的规则下移一级即可解决。我的./tslint.json 有我关心的所有其他规则,然后我创建了./src/tslint.json,看起来就像

    {
        "rules": {
            "no-unused-expression": true
        },
        "extends": "../tslint.json"
    }
    

    tslint 自动检查每个级别的配置文件,因为它下降树(使用--project 或使用 VSCode 扩展名)所以这意味着我的测试(在./test/ 下)应用了所有其他规则,但是@ 987654326@ 仅适用于./src/ 下的文件。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2019-03-28
      • 2020-04-09
      • 1970-01-01
      • 2019-12-22
      • 2020-05-25
      • 2016-01-08
      • 2021-01-19
      相关资源
      最近更新 更多