我目前正在将我的 MsTest 单元测试转换为 xUnit。在 xUnit 中,有没有一种方法可以测试异常消息?测试异常消息是否正确,而不是仅测试异常类型?
我目前正在将我的 MsTest 单元测试转换为 xUnit。在 xUnit 中,有没有一种方法可以测试异常消息?测试异常消息是否正确,而不是仅测试异常类型?
我认为测试异常类型和消息是正确的做法。在xUnit中,这两者都很容易实现:
var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);
[Fact]
public void Divide_TwoNumbers_ExpectException()
{
var sut = new Calculator();
var exception = Record.Exception(() => sut.Divide(10, 0));
Assert.IsType(typeof(DivideByZeroException), exception);
}
希望这能帮到你...
类似这样的
var ex = Record.Exception(() => DoSomeThing());
Assert.IsType(typeof(ArgumentNullException), ex);
Assert.True(ex.Message.Contains("Your exception message"));
顺便说一句,Resharper不喜欢使用typeof,而是建议使用Assert.IsType,例如:
var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);
Assert.Throws<ArgumentNullException>()
除非您正在单元测试自定义异常并且希望确保生成的消息符合您的预期,否则可能会有例外情况。或者,如果可以使用相同的异常类型但具有不同消息的两种方式抛出,则针对消息进行断言将是有价值的。
Throws()
返回异常 -- 不需要捕获它。 - the_joric异常并不比测试的任何其他预期结果更加特殊。测试消息是否正确是很自然的事情,因为同一种异常类型可以有两个不同的消息。然而,我个人认为这并非必须,至少在所有异常中都不是。
在我们的项目中,每个应用程序异常也附带一个“Message”对象,因此我们仅验证MessageId,而不验证消息参数是否正确或消息文本是否正确。例如,如果消息文本为“提供了错误的参数<{0}>”,我们不会检查传递给格式化程序{0}的参数是否符合预期 - 这不是意图。消息具有唯一的ID-因此,我们验证异常上的MessageID是否为'WRONG_PARAMETER_PROVIDED'。
考虑到异步编程的问题,新版本将会是:
var ex = await Record.ExceptionAsync(() => myMethod(myParams));
Assert.IsType<SomeException>(ex);
Assert.Equal("My text of the error.", ex.Message);
message
参数是什么? - Mark Embling