为避免断言中的“包含”的Eslint规则抛出“应有1个错误但有0个错误”

时间:2019-07-03 07:32:01

标签: javascript eslint cypress

我正在创建新规则,以避免在“应该”声明中使用“包含”。我用过'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"
            }]
        }
    ]
});

2 个答案:

答案 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可能是该规则的好地方)。