期望()没有实际期望

ale*_*cxe 14 javascript testing end-to-end jasmine protractor

问题:

最近,在查看我们现有的测试代码库时,我注意到在expect()没有"匹配"部分时使用了一种危险的拼写错误/错误:

expect(page.filters.fromDateLabel.getText(), "After");
Run Code Online (Sandbox Code Playgroud)

我很确定toEqual()这里有用的意思:

expect(page.filters.fromDateLabel.getText()).toEqual("After");
Run Code Online (Sandbox Code Playgroud)

这个问题是jasmine在这种情况下不会失败的预期(很明显,因为实际上并没有预料到).这让我们遇到了一个更严重的问题 - 在测试案例中没有实际测试过 - 它没有任何期望.我们对测试的内容产生了错误的认识.

问题:

我想尽快抓住这些错误.您认为我应该如何处理这个问题?

思考:

  • 如果没有对它做出任何期望(不确定是否jasmine有这样的内置),它会以某种方式使测试用例失败
  • expect()如果"期望"部分没有调用任何内容,则"修补" 并发出警告/引发错误
  • 使用静态代码分析 - 定义自定义eslint规则

ale*_*cxe 7

答案中提供的自定义ESLint规则现在是eslint-plugin-jasmine1.6.0 的一部分:


旧答案:

这是我最终得到的自定义ESLint规则:

module.exports = function (context) {
  return {
    // checking "expect()" arguments
    CallExpression: function (node) {
      if (node.callee.name === 'expect') {
        if (node.arguments.length > 1) {
          context.report(node, 'More than one argument passed to expect()')
        } else if (node.arguments.length === 0) {
          context.report(node, 'No arguments passed to expect()')
        }
      }
    },

    // nothing called on "expect()"
    'CallExpression:exit': function (node) {
      if (node.callee.name === 'expect' && node.parent.type === 'ExpressionStatement') {
        context.report(node, 'Nothing called on expect()')
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它检查3件事:

  • 超过1个参数传递给 expect()
  • 没有参数传递给 expect()
  • 没有任何东西可以召唤 expect()

以下是expect()目前捕获的无效用法示例:

expect(page.filters.fromDateLabel.getText(), "After");
expect("After");
expect();
Run Code Online (Sandbox Code Playgroud)

对于选项#1,实际上ESLint已经实现了一个非常相关且有用的规则,并且由[ eslint-plugin-jasmine] 开源: