我正试图欺骗测试覆盖率计算,使其使用while true循环。我使用的覆盖率工具认为测试覆盖率不足,因为while-ending用例从未执行过。这显然是覆盖率计算中的一个错误。然而,我正试图发明一些有效的方法,直到覆盖率计算在上游得到固定,或者至少直到实现了合适的忽略注释。
有问题的代码如下所示。这很好,测试也很好。然而,由于while循环从未退出,我得到了丢失的代码覆盖率。
function* greetings1(): Generator<string, never, undefined> {
while(true) {
yield 'hello'
}
}
我探索了创建一个常量TRUE
的想法,通过模拟常量TRUE
并用循环中存在的false
值替换它,可以让特制的测试退出循环。但是,这给了我一个类型错误A function returning 'never' cannot have a reachable end point. ts(2534)
。
const TRUE: true = true
function* greetings2(): Generator<string, never, undefined> {
while(TRUE) {
yield 'hello'
}
}
是否可以添加一个退出while true循环的转义图案,而不必牺牲类型和结果来铸造整个函数体?如果需要的话,我可以用常量TRUE
来做一个棘手的演员阵容。
我还尝试了一些使用break
的技巧。然而,覆盖工具认为break
的使用与变为false的条件不同,因此这并不能完全解决我的问题。如果有解决方案,可能需要以使while循环自然结束为基础。
一年前,我发布了一个关于特定代码覆盖工具的相关问题。查看伊斯坦布尔代码覆盖率:忽略其他分支的while true循环
Ugh,这是一个棘手的问题。您有一个工具希望看到循环可能退出(测试覆盖率工具(,另一个工具则希望看到它永远不会退出(TypeScript(。
遗憾的是,在这种特殊的情况下,我认为你最好的选择是ts-expect-error
注释:
const TRUE: true = true;
// @ts-expect-error 2534
function* greetings2(): Generator<string, never, undefined> {
while (TRUE) {
yield "hello";
}
}
游乐场链接
这一消息会告诉TypeScript,您希望它后面的代码会给您该错误,而只该错误,它应该忽略它。如果情况发生变化,代码不会产生该错误,或者它产生其他错误,TypeScript会抱怨,所以它比@ts-ignore
好得多。
我真的不喜欢这样做(或者类型断言,实际上就是这样(,但在这种工具冲突的情况下,我认为你没有太多选择。
以下是其他可能有效的方法:
const TRUE: true = true
function* greetings2(): Generator<string, never, undefined> {
while(TRUE) {
yield 'hello'
}
throw new Error("Unreachable");
}
游乐场链接
在循环后无条件抛出异常应该足以让Typescript相信函数永远不会退出,而且它不会影响程序的正常行为。
你的覆盖工具是否喜欢它是另一个问题,我想:(