You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:27:31