2011-01-20 87 views
2

我有以下代码:C#最佳实践:引用其他方法的单元测试代码?

public static String GetHashString(this HashAlgorithm algorithm, Stream inputStream) 
    { 
     if (algorithm == null) 
      throw new ArgumentNullError("algorithm"); 

     if (inputStream == null) 
      throw new ArgumentNullError("inputStream"); 

     Byte[] bytes = algorithm.ComputeHash(inputStream); 

     //Convert the bytes into a hash string 
     String result = ...; 
     return result; 
    } 

我想知道几件事情:

  1. 望着Microsoft.NET4 HashAlgorithm.ComputeHash(Stream inputStream)方法我可以看到 有一个异常 可能会回来。在这种情况下练习 行Byte[] bytes = algoirthm.ComputeHash(inputStream) 这是一个最好的 与try-catch块吗?我问 ,因为在我看来,如果该 线引发异常,我可以让 呼叫我的扩展处理错误 捕捉。或者,它应该是 try-catch包裹着简单的 扔。

  2. 此外,在单元测试,我单位 测试所有可能的例外, 包括那些可能来自 其他方法?特别是在这 的情况下...是最佳做法吗?在这 的情况下,我只需要 预计ObjectDisposeException。 但我想知道 的情况,我打电话的方法可能会抛出 回10个不同的例外。由于我 在这些例外情况下并不真正改变我的输出 ,我不认为 有必要单元测试导致相同 结果的所有不同 类型的故障。我想这是否正确?

  3. 最后,我不知道是否是 必要甚至检查 的inputStream被空,如果 HashAlgorithm.computeHash(Stream inputStream)方法甚至没有做 如此。

回答

2

记住,您应该测试代码,而不是.NET框架,

我不会把字节[]字节= algoirthm.ComputeHash(的inputStream)在try-catch块,代码谁正在调用你的方法将不得不处理。

当单元测试你可以测试一些用例并确保有效输入时不会抛出任何异常,并且输入无效时会抛出例外异常。

我觉得你的代码是确定,正是因为.NET抛出异常的InputStream为null,你正在做这个检查,如果调用代码传递一个空的inputStream

达维德扔ArgumentNullException

+0

好吧,如果.NET抛出一个异常,如果InputStream为空,我应该甚至麻烦检查它?我应该让.NET抛出异常,而不是我这样做? – michael 2011-01-20 16:25:29

0

单元测试此方法时,您要确保给定的有效(正确)输入得到正确(预期)的输出。你不可能处理所有情况,所以只要处理那些重要且可能发生的情况。您应该优雅地处理无效输入(例如,当您为null输入值抛出异常时)并测试您的方法如何处理无效输入。

0
  1. 做一个try...catch只,如果你想以某种方式处理异常(即使这意味着抛出一个新的异常 - 但在这种情况下使用innerException参数)。如果在发生异常情况下无法做任何事情,则无需使用它。
  2. 要启动的百般一些一段代码可以去错误的想法是疯狂的方式。您必须测试所有可能的成功执行,您应该测试最常见的错误,但有时你只是无法测试所有可能的情况。使用你自己的判断。
  3. 如果它是不可能的.NET方法返回null,我想这是确定没有测试这种可能性。顺便说一下,一些工具(如ReSharper)可以帮助你做出这样的决定。

关于第3项,你正在做的这种测试是一个先决条件,并且该编程风格被称为Design by Contract。有一个新的.NET框架来帮助定义先决条件,后置条件和不变 - 我猜你应该在它看一看:

DevLabs: Code Contracts