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

时间:2011-03-21 10:50:57

标签: unit-testing mstest xunit

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

8 个答案:

答案 0 :(得分:54)

我认为测试Exception类型和消息都是正确的。在xUnit中都很容易:

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

答案 1 :(得分:1)

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

Assert.Throws<ArgumentNullException>()

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

答案 2 :(得分:1)

最好使用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);
    }

希望这会有所帮助......

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

像这样的东西

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

答案 5 :(得分:0)

BTW,Resharper不喜欢使用typeof,而是建议使用Assert.IsType,例如。

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:-1)

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