在单元测试中匹配异常消息

时间:2014-07-08 17:04:16

标签: c# unit-testing exception

我无法复制本演练的最后部分 Walkthrough: Creating and Running Unit Tests for Managed Code

而不是我的单元测试通过,我得到Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange failed. Expected:<Debit amount less than zero. Parameter name: amount Actual value was -100.>. Actual:<Debit amount less than zero.>.我无法弄清楚如何从异常中获取消息而不获取参数信息,这似乎是演练中的预期行为。

我的代码来自BankAccount.class中的Debit的相关部分:

  if (amount < 0)
            {
                throw new ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
            }

我的代码的相关部分来自BankAccountTests.cs中的Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange:

        try
        {
            account.Debit(debitAmount);
        }
        catch (ArgumentOutOfRangeException e)
        {
            Assert.AreEqual(e.Message, BankAccount.DebitAmountLessThanZeroMessage);
            return;
        }

1 个答案:

答案 0 :(得分:1)

依赖于Exception消息的确切文本是相当脆弱的。

如果您调用的代码的开发人员更改了文本,可能是为了提供更多详细信息,那么您对确切消息的测试将会失败。这似乎是在这种情况下发生的事情。

如果异常必须向调用者传达可以自动处理的其他有用信息,我建议使用自定义异常类型来编码该附加信息。

要使此特定情况通过测试,您可以编辑引发异常的基础代码,以便它抛出单元测试所需的消息文本,或者修改单元测试以检查消息文本是否为实际上被扔了。