gpt4 book ai didi

javascript - 为什么 Istanbul/tap 代码覆盖在覆盖每个条件路径时报告 switch 语句未覆盖?

转载 作者:行者123 更新时间:2023-11-30 20:37:45 27 4
gpt4 key购买 nike

在 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 之后添加冗余的 break,但是这些随后(正确!)标记为未覆盖(因为它们无法访问)。

我想也许它在提示,因为它有一个测试,例如,在返回 1 而不是 'b'< 的路径中的 'a'/ 在同一路径中。但如果那是问题所在,我不明白为什么它会标记 switch 语句本身,而不是那些特定的行。

最佳答案

当我让测试涵盖所有可能的 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)
}

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

关于javascript - 为什么 Istanbul/tap 代码覆盖在覆盖每个条件路径时报告 switch 语句未覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com