我无法复制本演练的最后部分 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;
}
答案 0 :(得分:1)
依赖于Exception消息的确切文本是相当脆弱的。
如果您调用的代码的开发人员更改了文本,可能是为了提供更多详细信息,那么您对确切消息的测试将会失败。这似乎是在这种情况下发生的事情。
如果异常必须向调用者传达可以自动处理的其他有用信息,我建议使用自定义异常类型来编码该附加信息。
要使此特定情况通过测试,您可以编辑引发异常的基础代码,以便它抛出单元测试所需的消息文本,或者修改单元测试以检查消息文本是否为实际上被扔了。