gpt4 book ai didi

c# - 如何测试不应该执行的代码?

转载 作者:太空狗 更新时间:2023-10-29 17:28:52 25 4
gpt4 key购买 nike

只有在确认存在无效数字(通过调用另一个方法)时才调用以下方法。如何测试覆盖以下代码段中的 throw 行?我知道一种方法是将 VerifyThereAreInvalidiDigits 和此方法合并在一起。我正在寻找任何其他想法。

public int FirstInvalidDigitPosition {
get {
for (int index = 0; index < this.positions.Count; ++index) {
if (!this.positions[index].Valid) return index;
}
throw new InvalidOperationException("Attempt to get invalid digit position whene there are no invalid digits.");
}
}

我也不想编写单元测试来执行不应该执行的代码。

最佳答案

如果有问题的“throw”语句在任何可能的情况下确实无法访问,那么它应该被删除并替换为:

Debug.Fail("This should be unreachable; please find and fix the bug that caused this to be reached.");

如果代码可访问,则编写单元测试来测试该场景。公共(public)可访问方法的错误报告场景是完全有效的场景。您必须正确处理所有输入,甚至是错误的输入。如果正确的做法是抛出异常,则测试您是否抛出异常。

更新:根据评论,实际上不可能命中错误,因此无法访问代码。但现在 Debug.Fail 也无法访问,并且无法编译,因为编译器注意到返回值的方法具有可访问的终点。

第一个问题实际上应该不是问题;当然,代码覆盖工具应该是可配置的,以忽略无法访问的仅调试代码。但是这两个问题都可以通过重写循环来解决:

public int FirstInvalidDigitPosition 
{
get
{
int index = 0;
while(true)
{
Debug.Assert(index < this.positions.Length, "Attempt to get invalid digit position but there are no invalid digits!");
if (!this.positions[index].Valid) return index;
index++;
}
}
}

另一种方法是重新组织代码,这样您就不会在第一时间遇到问题:

public int? FirstInvalidDigitPosition { 
get {
for (int index = 0; index < this.positions.Count; ++index) {
if (!this.positions[index].Valid) return index;
}
return null;
}
}

现在您不需要限制调用者先调用 AreThereInvalidDigits;只需让任何时候调用此方法合法即可。这似乎是更安全的做法。如果您不做一些昂贵的检查来验证它们是否可以安全调用,就会爆炸的方法是脆弱、危险的方法。

关于c# - 如何测试不应该执行的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3535157/

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