在推送规范更改之前,我偶尔会忘记从我的 Mocha 规范中删除.only
调用。这样做显然会影响测试覆盖率,这需要解决故障。我想在推送更改之前捕获这些内容,理想情况下,作为 ESLint 检查过程的一部分,并且工作量最小。
您正在寻找mocha/no-exclusive-tests
规则,这是eslint-plugin-mocha
插件的一部分。 如果找到任何describe.only
或it.only
,它将失败。 非常有用!
从文档中:
此插件需要 ESLint 4.0.0 或更高版本。
npm install --save-dev eslint-plugin-mocha
然后在您的 eslint 配置中添加对此插件和所选规则的引用:
{ "plugins": [ "mocha" ], "rules": { "mocha/no-exclusive-tests": "error" } }
如果您也想防止it.skip
或xit
也提交,还有一个mocha/no-skipped-tests
。 但是,我发现.skip
有时是有效的,所以我发现最好只是防止.only
。
该插件还有大量其他有用的检查,因此请务必阅读他们的文档!
执行 mocha 时要传递一个--forbid-only
参数,这将使测试失败。
你也有--forbid-pending
.
这是来自官方文档:
--仅禁止导致测试标记为仅未通过套件
--禁止挂起导致挂起的测试和标记为跳过的测试使套件失败
另一个这样做的软件包是eslint-plugin-no-only-tests。
或者,现在可以通过遵循内置的 ESLint 规则来完成此操作,但它们也会将回调的整个函数体突出显示为错误:
"no-restricted-syntax": [
"error",
{
"selector": "CallExpression[callee.object.type='Identifier'][callee.object.name='it'][callee.property.type='Identifier'][callee.property.name='only']",
"message": "Do not commit it.only. Use it instead."
},
{
"selector": "CallExpression[callee.object.type='Identifier'][callee.object.name='describe'][callee.property.type='Identifier'][callee.property.name='only']",
"message": "Do not commit describe.only. Use describe instead."
}
]
对于排除fdescribe
和fit
,可以使用以下内容:
"no-restricted-globals": [
"error",
{
"name": "fdescribe",
"message": "Do not commit fdescribe. Use describe instead."
},
{
"name": "fit",
"message": "Do not commit fit. Use it instead."
},
]
我的解决方案是使用带有 grep
命令的简单 bash 脚本,添加到package.json
脚本部分,如下所示:
"scripts": {
"lint:only": "RESULT="$(grep -rHn '[.]only\|[.]skip' spec/ --color=always)"; if [ -n "$RESULT" ]; then printf "Oops! You left a few things in your specs! nn${RESULT}nn"; fi",
"lint": "eslint --ext js src config scripts bin config server; yarn lint:only"
...
}
简而言之,这会检查spec/
目录中是否有任何与.only
或.skip
匹配的内容,如果发现任何违规行为,则输出文件名 + 行。为了清晰起见,添加了颜色,并且脚本作为 ESLint 和 Yarn 棉绒的一部分运行。