如何测试永远不会执行的代码?

如果已经validation存在无效数字(通过调用另一种方法),则仅调用以下方法。 如何在以下代码段中测试覆盖throw -line? 我知道有一种方法可以将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."); } } 

我也不想写一个unit testing来运行永远不会被执行的代码。

如果有问题的“throw”语句在任何可能的情况下都无法访问 ,则应将其删除并替换为:

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

如果代码可以访问,那么编写一个测试该场景的unit testing。 公共可访问方法的错误报告方案是完全有效的方案。 您必须正确处理所有输入,甚至输入错误。 如果正确的做法是抛出exception然后测试你是否抛出exception。

更新:根据评论,实际上不可能命中错误,因此代码无法访问。 但是现在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; 只是让任何时候调用此方法合法。 这似乎是更安全的事情。 当你不做一些昂贵的检查以确认它们可以安全地打电话时爆炸的方法是脆弱的,危险的方法。

我不明白为什么你不想写一个unit testing来练习“不应该发生的代码”。

如果它“不应该发生”,那你为什么要编写代码呢? 因为您认为它当然可能发生 – 也许未来重构中的错误将破坏您的其他validation并且将执行此代码。

如果您认为编写代码是值得的,那么值得对其进行unit testing。

有时需要编写一小段无法执行的代码,只是为了安抚编译器(例如,如果一个总是抛出exception,退出应用程序的函数等,则从一个应该返回值的函数调用,编译器可能会坚持调用者包含一个“return 0”,“Return Nothing”等语句,这些语句永远不会执行。我不认为应该要求测试这样的“代码”,因为它可能是不可能的它执行时不会严重破坏系统的其他部分。

一个更有趣的问题是代码,处理器在正常情况下永远不能执行,但存在的目的是最大限度地减少exception情况造成的伤害。 例如,我编写的一些安全关键应用程序以类似的代码开头(实际应用程序是机器代码;下面给出的是伪代码)

   register = 0
  测试寄存器为零
  如果非零转到死
   register = register  -  1
  测试寄存器为零
  如果非零转到okay1
死:
  关闭一切
  转到死了
 okay1:
   register = register + 1
  如果非零转到死

我不确定如何在失败的情况下测试该代码。 该代码的目的是确保如果寄存器遭受静电或其他损坏,或者其他方式不起作用,系统将安全关闭。 但是,如果没有一些非常奇特的设备,我不知道如何测试这样的代码。

测试目的的一部分是测试应该发生的事情和可能发生的事情。

如果您的代码永远不应该执行,但可能在正确(或错误)条件下,您可以通过以下方式validation您的测试方法,在正确的条件下(在MS的unit testing框架中)validationexception:

 [ExpectedException(typeof(InvalidOperationException))]