在单元测试中匹配异常消息
本文关键字:异常 消息 单元测试 | 更新日期: 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消息的确切文本是相当脆弱的。
如果您调用的代码的开发人员更改了文本,也许是为了提供更多的细节,那么您对确切消息的测试将失败。这似乎就是在这个案例中发生的事情。
如果一个异常必须向调用者传递额外的有用信息,并且可以以自动的方式处理,我建议使用一个定制的异常类型来编码这些额外的信息。
要使这种特殊情况通过测试,您可以编辑抛出异常的底层代码,以便它抛出单元测试期望的消息文本,或者修改单元测试以检查实际被抛出的消息文本。