断言后如何获取异常对象?

Posted

技术标签:

【中文标题】断言后如何获取异常对象?【英文标题】:How to get the exception object after asserting? 【发布时间】:2020-08-10 10:22:36 【问题描述】:

例如,我的单元测试中有以下代码。

Action act = () => subject.Foo2("Hello");

act.Should().Throw<InvalidOperationException>()

在断言之后,我想对抛出的异常运行几个处理步骤,并对处理结果进行断言。例如:

 new ExceptionToHttpResponseMapper()
   .Map(thrownException)
   .HttpStatusCode.Should().Be(Http.Forbidden);

我可以写一个 try-catch 之类的,

var thrownException;
    try
    
    subject.Foo2("Hello");
    
    catch(Exception e)
    
    thrownException = e;
    

    // Assert

但我想知道是否有更好的方法。

【问题讨论】:

快速查看这里的文档fluentassertions.com/exceptions AndWhich 似乎可以访问抛出的异常。 地图返回什么类型? 【参考方案1】:

根据此处提供的文档,有几个选项

https://fluentassertions.com/exceptions/

AndWhich 似乎提供了对抛出的异常的访问。

还有一个Where 函数可以对异常应用表达式。

act.Should().Throw<InvalidOperationException>()
    .Where(thrownException => HasCorrectHttpResponseMapping(thrownException));

HasCorrectHttpResponseMapping

bool HasCorrectHttpResponseMapping(InvalidOperationException thrownException)

    var httpResponse = new ExceptionToHttpResponseMapper().Map(thrownException);
    return httpResponse.HttpStatusCode == Http.Forbidden;

【讨论】:

Where() 就足够了。谢谢。【参考方案2】:

将所有断言包装在 using _ = new AssertionScope()

【讨论】:

AssertionScope 用于批处理多个断言,因此失败的测试结果将显示所有断言的错误,而不是第一个失败的断言。你能在 OP 的背景下详细说明吗?

以上是关于断言后如何获取异常对象?的主要内容,如果未能解决你的问题,请参考以下文章

Selenium2+python自动化60-异常后截图(screenshot)

Selenium2+python自动化60-异常后截图(screenshot)

Selenium2+python自动化60-异常后截图(screenshot)转载

vue解析json对象取值异常处理

Jmeter 如何断言数据库返回的字段为NULL

我们如何在捕获中的异常中获取用户定义对象