我有以下代码:
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;
}
我想知道几件事:
查看Microsoft.NET4
我可以看到HashAlgorithm.ComputeHash(Stream
inputStream)
方法
有一个例外
可以回来。这是最好的吗?
在这种情况下练习包装
第Byte[] bytes =
algoirthm.ComputeHash(inputStream)
行
有一个try-catch块?我问
因为在我看来,如果那样的话
line抛出异常我可以调用
我的扩展程序处理错误
醒目。或者,它应该是
try-catch包裹着一个简单的
抛出。
另外,在单元测试时,我是否单元
测试所有可能的异常,
包括那些可能来自的人
其他方法?特别是在这
案例......这是最佳做法吗?在这
情况我只需要
期待ObjectDisposeException
。
但我想知道情况
我称之为可抛出的方法
回10个不同的例外。因为我
并没有真正改变我的输出
关于这些例外情况,我不这么认为
有必要对所有不同的单元进行测试
导致相同的失败类型
结果。我是否认为这是正确的?
最后,我想知道是不是
甚至需要检查
如果是,inputStream为null
HashAlgorithm.computeHash(Stream
inputStream)
方法甚至都没有
如此。
答案 0 :(得分:2)
请记住,您应该测试代码而不是.NET Framework,
我不会在try-catch块中放置Byte [] bytes = algoirthm.ComputeHash(inputStream),调用方法的代码必须处理它。
当进行单元测试时,你可以测试一些用例,并确保在有效输入的情况下不会抛出任何异常,并且输入无效时会引发例外异常。
我认为您的代码没问题,因为如果inputStream为null,.NET会抛出异常,如果调用代码传递了null inputStream,您正在执行此检查并抛出 ArgumentNullException
的Davide。
答案 1 :(得分:0)
当单元测试此方法时,您希望确保给定的有效(正确)输入正确(预期)输出。你不可能处理所有情况,所以只需处理重要且可能发生的情况。您应该优雅地处理无效输入(例如,当您抛出null
输入值的异常时)并测试您的方法如何处理无效输入。
答案 2 :(得分:0)
try...catch
(即使这意味着抛出新的异常 - 但在这种情况下使用innerException
参数)。如果在发生异常时无法执行任何操作,则无需使用它。关于第3项,你正在做的那种测试是一个先决条件,这种编程风格称为Design by Contract。有一个新的.NET框架可以帮助定义前置条件,后置条件和不变量 - 我想你应该看看它: