xunit 中的异常消息包含参数,因此我的测试失败

Ant*_*man 1 c# unit-testing exception xunit

我试图检查我抛出的异常是否给出了正确的错误消息。

我在类中有一个方法可以从值中提取(减去)。如果该值小于 0,我会抛出异常。

if (amount < 0)
{
    throw new System.ArgumentOutOfRangeException("amount", AmountLessThanZeroMessage);
}
Run Code Online (Sandbox Code Playgroud)

这是我的错误消息:

public const string AmountLessThanZeroMessage = "Amount is less than zero";
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编写单元测试以查看是否收到正确的消息时,它因参数而失败。这是测试:

[Fact]
public void CannotWithdrawLessThanZero()
{
    // Arrange
    var account = new Account("User", 23);

    // Act
    account.DepositCash(100);
    var thrownException = Assert.Throws<ArgumentOutOfRangeException>(() => account.WithdrawCash(-10));

    // Assert
    Assert.Equal(Account.AmountLessThanZeroMessage, thrownException.Message);
}
Run Code Online (Sandbox Code Playgroud)

结果最后包含参数,导致测试失败: 在此输入图像描述

看起来实际的消息包括它引用的参数。我该如何更正此消息?我应该将该行添加(Parameter 'amount')到预期的字符串中,还是有更好的选择?

Lut*_*lho 5

您可以创建完全相同的异常并使用其消息属性。就像下面的代码一样

[Fact]
public void CannotWithdrawLessThanZero()
{
    // Arrange
    var account = new Account("User", 23);
    var expectedException = new System.ArgumentOutOfRangeException("amount", AmountLessThanZeroMessage);

    // Act
    account.DepositCash(100);
    var thrownException = Assert.Throws<ArgumentOutOfRangeException>(() => account.WithdrawCash(-10));

    // Assert
    Assert.Equal(expectedException.Message, thrownException.Message);
}
Run Code Online (Sandbox Code Playgroud)