我正在创建新规则,以避免在“应该”声明中使用“包含”。我用过'yo eslint:plugin',然后用'yo eslint:rule'创建结构。现在尝试编写规则。
不幸的是,npm test
之后我得到了AssertionError [ERR_ASSERTION]: Should have 1 error but had 0: []
。
lib / rules / no-contain-assertion.js
module.exports = {
meta: {
docs: {
description:
"Rule to flag use of should.('contain') in tests, preventing tests with non strict assertion being committed accidentally",
category: "StrictAssertion",
recommended: false
},
fixable: null, // or "code" or "whitespace"
schema: [
// fill in your schema
]
},
create: function(context) {
return {
StrictAssertion(node) {
if (node.object.name === 'should' && node.arguments[0] === 'contain') {
context.report({
node,
message: `Don't use ${node}(${node.arguments[0]})`,
});
}
}
};
}
};
tests / lib / rules / no-contain-assertion.js
var ruleTester = new RuleTester();
ruleTester.run("no-contain-assertion", rule, {
valid: [
"should('have.text')"
],
invalid: [
{
code: "should('contain')",
errors: [{
message: "Don't use 'contain' in assertion!",
type: "StrictAssertion"
}]
}
]
});
答案 0 :(得分:1)
我知道回答这个问题可能为时已晚,但是现在我正在开发一个ESLint插件,所以我遇到了这个问题。我通过向项目添加x = [2,0,1]
y = [3,1,4]
plt.scatter(x,y)
解决了这个问题。
babel-eslint
babel-eslint
.eslintrc.js
$ npm install eslint babel-eslint --save-dev
# or
$ yarn add eslint babel-eslint -D
答案 1 :(得分:0)
问题是您不应该这样:
return {
StrictAssertion(node) {
StrictAssertion
不是AST类型(至少是AFAIAA)。
您要匹配should('contain')
的是CallExpression
。
每个解析器都定义了AST类型(尽管它们应遵循ESTree,并且只有一些实验性JavaScript功能在不同的解析器中具有不同的名称,例如babel-eslint
当前使用的{{1} },而ESLint的默认解析器Espree(除非您的配置添加了ExperimentalRestProperty
,否则使用parser
)。
因此,您可以查询用于解析器的文档以了解更多信息。 ESLint本身给出了brief description的AST。
但是,我发现使用ASTExplorer之类的工具可以最轻松地了解JavaScript如何映射到AST,该工具可让您查看所提供JavaScript代码的AST树。如果您将“转换”功能与“ ESLint 4”一起使用(是的,它位于当前版本7的后面,但仍然非常有用),您甚至可以在那里调试规则。
除了使用裸露的AST类型之外,您还可以使用完整的ESLint选择器(实际上是esquery表达式),从而使您可以与CSS选择器类似地进行匹配,例如,在单个表达式中指定要查找规则的表达式仅具有特定父类型的孩子。在您的情况下,您不仅可以使用RestElement
然后通过属性过滤CallExpression
,还可以创建一个直接符合您所有要求的选择器,即node
。您可以为此查看AST资源管理器:https://astexplorer.net/#/gist/3770fc3a0d869a55f88797b3228994af/3e63f6b3b74f0123cdd107b134f4c9f4a4387f1a来查看其运行情况。
(顺便说一句,如果您将规则填写到提供相关规则的https://github.com/ihordiachenko/eslint-plugin-chai-friendly上,则可能要考虑提交规则,尽管不是一个规则,也可能要提交到针对内部规则的https://github.com/Turbo87/eslint-plugin-chai-expect上)文字,但目前仅用于 我忽略了您注意到的是赛普拉斯的CallExpression[callee.name="should"] > Literal[value="contain"]
。)expect
,而不是柴的。但是上面的其余部分仍然是准确/相关的(也许eslint-plugin-cypress可能是该规则的好地方)。