C# 单元测试中的匹配异常消息

C# 单元测试中的匹配异常消息,c#,unit-testing,exception,C#,Unit Testing,Exception,我无法复制本演练的最后部分 . 我没有通过单元测试,而是通过GumentAutofrange失败获得Debit_WhenAmounts小于零时的Debit_。预期:。实际:。我不知道如何只从异常中获取消息而不获取参数信息,这似乎是演练中的预期行为 BankAccount.class中借方代码的相关部分: if (amount < 0) { throw new ArgumentOutOfRangeException("amount

我无法复制本演练的最后部分 .

我没有通过单元测试,而是通过GumentAutofrange
失败获得Debit_WhenAmounts小于零时的Debit_。预期:。实际:。
我不知道如何只从异常中获取消息而不获取参数信息,这似乎是演练中的预期行为

BankAccount.class中借方代码的相关部分:

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

依赖异常消息的确切文本是相当脆弱的

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

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

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

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