用 chai 摆脱 no-unused-expressions linter 错误的好方法

Posted

技术标签:

【中文标题】用 chai 摆脱 no-unused-expressions linter 错误的好方法【英文标题】:Nice way to get rid of no-unused-expressions linter error with chai 【发布时间】: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 所做的应该被视为一个错误。 【参考方案1】:

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

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

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

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

    
        "rules": 
            "no-unused-expressions": "off"
        
    
    

    使用主.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 answer 与Ihor 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/ 下的文件。

【讨论】:

以上是关于用 chai 摆脱 no-unused-expressions linter 错误的好方法的主要内容,如果未能解决你的问题,请参考以下文章

用 Chai 处理 promise 拒绝

Chai 中的“assert”、“expect”和“should”有啥区别?

chai.js中文文档

Mocha / Chai expect.to.throw 没有捕捉到抛出的错误

Cypress系列(12)- Cypress 编写和组织测试用例篇 之 断言

Cypress系列(12)- Cypress 编写和组织测试用例篇 之 断言