使用 xUnit 进行单元测试异常消息

问题描述 投票:0回答:8

我目前正在将我的 MsTest 单元测试转换为 xUnit。使用xUnit,有没有办法测试异常消息?测试异常消息而不是仅测试异常类型是否正确?

unit-testing mstest xunit
8个回答
144
投票

我认为测试异常类型和消息是正确的。在 xUnit 中两者都很简单:

var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);

10
投票

最好使用 Record.Exception 方法,因为它与 AAA 模式匹配:

    [Fact]
    public void Divide_TwoNumbers_ExpectException()
    {
        var sut = new Calculator();
        var exception = Record.Exception(() => sut.Divide(10, 0));
        Assert.IsType(typeof(DivideByZeroException), exception);
    }

希望这有帮助...


2
投票

类似这样的:

var ex = Record.Exception(() => DoSomeThing());
Assert.IsType(typeof(ArgumentNullException), ex);
Assert.Contains("Your exception message", ex.Message);

1
投票

顺便说一句,Resharper 不喜欢使用 typeof 并建议改为 Assert.IsType,例如

var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);

0
投票

异常与测试的任何其他预期结果没有什么不同。测试消息是否正确是很自然的事情,因为两个不同的消息可以出现在相同的异常类型中。然而 - 我个人并不认为这是强制性的,至少不是在所有例外情况下。

在我们的项目中,每个应用程序异常还附加了一个“消息”对象,因此我们仅验证 MessageId,我们不验证消息参数是否正确或消息文本。例如,如果消息文本是“提供了错误的参数 <{0}>”,我们不会检查传递给格式 {0} 的参数是否符合预期 - 这不是意图。该消息具有唯一的 ID - 因此我们验证异常上的 MessageID 是否为“WRONG_PARAMETER_PROVIDED”。


0
投票

xUnit 使用 Assert.Throws 来测试异常类型。如果需要,您可以捕获异常并针对消息断言。我认为一般来说你想测试是否抛出了预期的异常,而确切的消息确实没有必要。

Assert.Throws<ArgumentNullException>()

例外情况可能是,如果您有一个自定义异常,您正在进行单元测试,并且您希望确保生成的消息符合您的预期。或者,如果有两种方法可以抛出相同的异常类型但具有不同的消息,那么针对消息进行断言将是有价值的


0
投票

鉴于异步内容,新版本将是

var ex = await Record.ExceptionAsync(() => myMethod(myParams));
Assert.IsType<SomeException>(ex);
Assert.Equal("My text of the error.", ex.Message);

-1
投票

xUnit 网站还提到了“Record.Exception”构造。

© www.soinside.com 2019 - 2024. All rights reserved.