用 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 友好。修改后的规则会忽略 expect
和 should
语句,同时保留其他所有内容的默认行为。
【讨论】:
+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 describe
、it
、beforeEach
等的误报,而无需完全禁用 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 中的“assert”、“expect”和“should”有啥区别?
Mocha / Chai expect.to.throw 没有捕捉到抛出的错误