我正在将我的MsTest单元测试转换为xUnit。使用xUnit,有没有办法测试异常消息?测试异常消息是否正确,而不仅仅是异常类型?
答案 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)
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”构造。