代码覆盖率显示 if-branch 被遗漏但删除它会导致错误
Code coverage shows if-branch as missed but removing it leads to error
我正在用 if-branch 测试代码
fVal => {
if(!fCache[idxF]) fCache[idxF] = {}
fCache[idxF][idxCb] = fVal
}
即declared as "missed" by Coveralls。
但是,如果我删除该 if 行,
the tests fail complaining about undefined prop:
fCache[idxF][idxCb]=fVal;
^
TypeError: Cannot set property '0' of undefined
这正是if分支修正的错误。
那为什么在coverage中声明为"missed"呢?
已添加。
这是失败的测试:
test('ap over single CPS function', t => {
const cpsFun = cb => cb(42)
const cpsNew = ap(cb => cb(x => x*2))(cpsFun)
cpsNew(t.cis(84))
})
和正在测试的代码的相关部分:
const ap = (...fns) => cpsFn => {
let fCache = {},
argsCache = {}
...
fns.forEach((f, idxF) => f(...cbs.map((cb, idxCb) =>
fVal => {
if(!fCache[idxF]) fCache[idxF] = {}
...
}
)))
}
return cpsNew
}
您的代码有点难以理解,但根据您问题的内容,我猜您不了解条件分支的代码覆盖率是如何工作的。
"if" 语句产生 2 个分支:条件真和条件假。如果您的测试仅对条件评估为 "true" 的数据进行操作,那么您的覆盖率恰好是 2 个分支中的 1 个(我相信这是报告告诉您的)。
要获得该行的 100% 覆盖率,您必须在该行上进行 2 次执行传递 - 一次条件评估为真,另一次条件评估为假。
我正在用 if-branch 测试代码
fVal => {
if(!fCache[idxF]) fCache[idxF] = {}
fCache[idxF][idxCb] = fVal
}
即declared as "missed" by Coveralls。
但是,如果我删除该 if 行, the tests fail complaining about undefined prop:
fCache[idxF][idxCb]=fVal;
^
TypeError: Cannot set property '0' of undefined
这正是if分支修正的错误。 那为什么在coverage中声明为"missed"呢?
已添加。 这是失败的测试:
test('ap over single CPS function', t => {
const cpsFun = cb => cb(42)
const cpsNew = ap(cb => cb(x => x*2))(cpsFun)
cpsNew(t.cis(84))
})
和正在测试的代码的相关部分:
const ap = (...fns) => cpsFn => {
let fCache = {},
argsCache = {}
...
fns.forEach((f, idxF) => f(...cbs.map((cb, idxCb) =>
fVal => {
if(!fCache[idxF]) fCache[idxF] = {}
...
}
)))
}
return cpsNew
}
您的代码有点难以理解,但根据您问题的内容,我猜您不了解条件分支的代码覆盖率是如何工作的。
"if" 语句产生 2 个分支:条件真和条件假。如果您的测试仅对条件评估为 "true" 的数据进行操作,那么您的覆盖率恰好是 2 个分支中的 1 个(我相信这是报告告诉您的)。
要获得该行的 100% 覆盖率,您必须在该行上进行 2 次执行传递 - 一次条件评估为真,另一次条件评估为假。