区分方法和属性

时间:2016-06-12 16:54:21

标签: javascript testing jasmine eslint static-code-analysis

问题:

我正在改进eslint-plugin-jasmine包的Share to menu image,试图在未调用匹配器时再处理一个无效的Jasmine expect()

expect(true).toBeDefined;

有效用法:

expect(true).toBeDefined();

我变得非常接近 - 我可以确定expect()上有成员表达式:

// matcher was not called
MemberExpression: function (node) {
  if (node.object && node.object.callee.name === 'expect') {
    console.log(node.property)
  }
}

但有效和无效案例中的node.property属于Identifier类型:

Node {
  type: 'Identifier',
  start: 13,
  end: 24,
  loc: 
   SourceLocation {
     start: Position { line: 1, column: 13 },
     end: Position { line: 1, column: 24 } },
  range: [ 13, 24 ],
  name: 'toBeDefined' }

并没有明显的迹象表明这是属性或方法。

问题:

如何在ESLint中确定属性是否可调用?

1 个答案:

答案 0 :(得分:1)

expect(true).toBeDefined被解析为MemberExpression节点,但expect(true).toBeDefined()解析为CallExpression。我真的不是100%确定为什么会发生这种情况,但在第二种情况下,它似乎认为直到开括号的整个陈述是一个CallExpression,我希望有两个单独的{{ 1}},但似乎并非如此。

所以你可以做的就是听CallExpression并检查被叫CallExpression的名字为Identifier。然后检查祖父母是expect还是MemberExpression