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

本文关键字:异常 消息 单元测试 | 更新日期: 2023-09-27 18:11:56

我无法复制本演练的最后部分演练:为托管代码创建和运行单元测试。

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

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

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

我在BankAccountTests.cs中的debit_whenamountislessthanzero_shouldthrowargumentoutorange代码的相关部分:

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

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

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

如果您调用的代码的开发人员更改了文本,也许是为了提供更多的细节,那么您对确切消息的测试将失败。这似乎就是在这个案例中发生的事情。

如果一个异常必须向调用者传递额外的有用信息,并且可以以自动的方式处理,我建议使用一个定制的异常类型来编码这些额外的信息。

要使这种特殊情况通过测试,您可以编辑抛出异常的底层代码,以便它抛出单元测试期望的消息文本,或者修改单元测试以检查实际被抛出的消息文本。