【问题标题】:Why does Istanbul / tap code coverage report a switch statement as not covered when each conditional path is covered?为什么在覆盖每个条件路径时,Istanbul / tap code coverage 会报告 switch 语句未覆盖?
【发布时间】:2018-04-03 09:45:20
【问题描述】:

在 node.js 应用程序中,我有一个带有 getter 的类,其中包含一个大的 switch 语句,与此相同,但更大,具有未发布的产品特定值,而不是 a、b、c、1、2、3 等:

Class SomeClass () {
  constructor (someVar) {
    this.someProp = someVar
  }
  get someGetter () {
    switch (this.someProp) {
      case 'a':
      case 'b':
        return 1

      case 'c':
      case 'd':
      case 'e':
        return 2

      case 'f':
        return 3

      case undefined:
        return null

      default:
        return 0
    }
  }
}

然后我有一个像这样结构的测试用例,它到达每个可能的路径:

const expectedResults = new Map(Object.entries({
  a: 1,
  c: 2,
  f: 3,
  null: null,
  z: 0
}))

for (const [testCase, expected] of expectedResults) {
  const someInstance = new SomeClass(testCase)
  t.equal(someInstance.someGetter, expected)
}

t.end()

这让我覆盖了所有可能的路径,node tap 覆盖率报告中没有危险信号。

悬停,我得到一个(黄色)未覆盖的行,它是 switch 语句本身的行:示例代码中的第 6 行,行:

switch (this.someProp) {

我尝试在每个 return 之后添加冗余的 breaks,但这些随后(正确地!)标记为未覆盖(因为它们无法访问)。

我认为它可能在抱怨,因为它在返回 1 的路径中测试了 'a',但在同一路径中没有 'b'。但如果这就是问题所在,我不明白为什么它会标记 switch 语句本身,而不是那些特定的行。

【问题讨论】:

  • 有什么问题?你已经有了答案?你在这里问什么?
  • 我已将标题编辑为语法问题。如果您有问题,我们鼓励您发布自己的问题的答案:它与将来搜索相同问题的其他人分享知识,同时保持开放有人发布更好答案的可能性。见stackoverflow.com/help/self-answer

标签: javascript node.js code-coverage istanbul


【解决方案1】:

当我让测试覆盖所有可能的case:,而不只是每条路径时,未覆盖的线路通知消失了。

由于在我的真实世界代码中有很多很多情况,并且所有返回路径都被测试为正确,而不是大规模扩展 expectedResults 映射,我创建了另一个更简单的测试条件,它采用了一个简单的数组并简单地确保每个案例都被识别(没有回退到默认值)。喜欢:

const allCases = ['a', 'b', 'c', 'd', 'e', 'f']

for (const testCase of allCases) {
  const someInstance = new SomeClass(testCase)
  t.notEqual(someInstance.someGetter, 0)
}

通过与默认的回退值进行比较,这个测试至少有一些价值,它不仅仅是为了满足 100% 的覆盖率:它确保开关中没有可能的情况在将来被删除等(例如,如果 switch 语句被重新排序或修改)。

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2022-10-26
    • 2011-07-03
    相关资源
    最近更新 更多