在TypeScript中强制退出while(true)循环



我正试图欺骗测试覆盖率计算,使其使用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相信函数永远不会退出,而且它不会影响程序的正常行为。

你的覆盖工具是否喜欢它是另一个问题,我想:(

最新更新