C#最佳实践:单元测试代码是指利用其他方法?

时间:2011-01-20 15:55:54

标签: c# unit-testing

我有以下代码:

    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块?我问 因为在我看来,如果那样的话 line抛出异常我可以调用 我的扩展程序处理错误 醒目。或者,它应该是 try-catch包裹着一个简单的 抛出。

  2. 另外,在单元测试时,我是否单元 测试所有可能的异常, 包括那些可能来自的人 其他方法?特别是在这 案例......这是最佳做法吗?在这 情况我只需要 期待ObjectDisposeException。 但我想知道情况 我称之为可抛出的方法 回10个不同的例外。因为我 并没有真正改变我的输出 关于这些例外情况,我不这么认为 有必要对所有不同的单元进行测试 导致相同的失败类型 结果。我是否认为这是正确的?

  3. 最后,我想知道是不是 甚至需要检查 如果是,inputStream为null HashAlgorithm.computeHash(Stream inputStream)方法甚至都没有 如此。

3 个答案:

答案 0 :(得分:2)

请记住,您应该测试代码而不是.NET Framework,

我不会在try-catch块中放置Byte [] bytes = algoirthm.ComputeHash(inputStream),调用方法的代码必须处理它。

当进行单元测试时,你可以测试一些用例,并确保在有效输入的情况下不会抛出任何异常,并且输入无效时会引发例外异常。

我认为您的代码没问题,因为如果inputStream为null,.NET会抛出异常,如果调用代码传递了null inputStream,您正在执行此检查并抛出 ArgumentNullException

的Davide。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  1. 仅在您想以某种方式处理异常时才执行try...catch(即使这意味着抛出新的异常 - 但在这种情况下使用innerException参数)。如果在发生异常时无法执行任何操作,则无需使用它。
  2. 开始思考一些代码可能出错的一切可能方式就是疯狂的方式。您必须测试所有可能的成功执行,测试最常见的错误,但有时您无法测试每种可能的情况。用你自己的判断。
  3. 如果.NET方法无法返回null,我想可以不测试这种可能性。顺便说一句,一些工具(如ReSharper)可以帮助你做出这样的决定。
  4. 关于第3项,你正在做的那种测试是一个先决条件,这种编程风格称为Design by Contract。有一个新的.NET框架可以帮助定义前置条件,后置条件和不变量 - 我想你应该看看它:

    DevLabs: Code Contracts