小编典典

如何使用 Assert.Throws 断言异常的类型?

all

我如何使用Assert.Throws来断言异常的类型和实际的消息措辞?

像这样的东西:

Assert.Throws<Exception>(
    ()=>user.MakeUserActive()).WithMessage("Actual exception message")

我正在测试的方法会抛出多个相同类型的消息,但消息不同,我需要一种方法来测试是否根据上下文抛出了正确的消息。


阅读 99

收藏
2022-05-05

共1个答案

小编典典

Assert.Throws返回抛出的异常,让您对异常进行断言。

var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));

所以如果没有抛出异常,或者抛出了错误类型的异常,第一个Assert.Throws断言就会失败。但是,如果抛出了正确类型的异常,那么您现在可以断言您保存在变量中的实际异常。

通过使用此模式,您可以断言除异常消息之外的其他内容,例如在ArgumentException和派生的情况下,您可以断言参数名称是正确的:

var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));

您还可以使用 fluent API 来执行这些断言:

Assert.That(() => foo.Bar(null), 
Throws.Exception
  .TypeOf<ArgumentNullException>()
  .With.Property("ParamName")
  .EqualTo("bar"));

或者

Assert.That(
    Assert.Throws<ArgumentNullException>(() =>
        foo.Bar(null)
    .ParamName,
Is.EqualTo("bar"));

断言异常消息时的一个小技巧是用
装饰测试方法,SetCultureAttribute以确保抛出的消息使用预期的文化。如果您将异常消息存储为资源以允许本地化,这将发挥作用。

2022-05-05