如何用NUnit断言异常子类型及特定值/条件?
NUnit 异常断言的复合需求实现
问题背景
在NUnit中,我通常用以下方式做异常断言:
Assert.That(() => MyTest(), Throws.Exception.TypeOf<MyException>() .With.Message.EqualTo("Whoopsie!"));
但现在需要同时完成两个断言:
- 异常是
BaseException的子类型(类似假想的IsSubTypeOf) - 异常携带的状态码为
401(类似假想的MatchesCondition)
我原本期望的写法如下:
Assert.That(() => MyTest(), Throws.Exception.IsSubTypeOf<BaseException>() .With.Message.EqualTo("Whoopsie!") .And.MatchesCondition(exception => ((ObjectResult)exception.ActionResult) .StatusCode == StatusCodes.Status401Unauthorized));
但在NUnit里没找到现成的对应方法,想知道有没有内置实现,还是必须自定义?
内置解决方案
经过查找,NUnit已有内置的实现方式,使用InstanceOf<BaseException>()和Matches<BaseException>(...)即可满足需求:
Assert.That(() => MyTest(), Throws.Exception.InstanceOf<BaseException>() .With.Message.EqualTo("Whoopsie!") .And.Matches<BaseException>(exception => ((ObjectResult)exception.ActionResult) .StatusCode == StatusCodes.Status401Unauthorized));
由于Matches<BaseException>(...)会自动校验异常是否为BaseException(或其子类型),因此还可以进一步简化写法:
Assert.That(() => authenticator.Authenticate(), Throws.Exception.Matches<IbiActionResultException>(e => ((ObjectResult)e.ActionResult) .StatusCode == StatusCodes.Status401Unauthorized));
内容的提问来源于stack exchange,提问作者Tar
相关产品推荐
相关产品推荐

