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

xUnit.net旧版Assert.DoesNotThrow已移除,求替代断言方式

替代xUnit.net中已移除的Assert.DoesNotThrow的方案

嘿,这个问题我之前也碰到过!xUnit.net确实在新版本里移除了Assert.DoesNotThrow,不过替代方案很简单,分两种情况来说:

1. 最简单的方式:直接执行代码

xUnit的测试逻辑默认就是如果代码执行过程中没有抛出未捕获的异常,测试就会自动通过。所以你完全可以去掉原来的Assert.Throws.Nothing(也就是旧版的Assert.DoesNotThrow),直接执行目标代码就行。你的示例可以改成这样:

[Fact]
public void returns_json_response() 
{
    string results = execute("Batman");
    // 直接执行反序列化操作,没抛异常测试就通过
    new JavaScriptSerializer().Deserialize<dynamic>(results);
}

2. 显式断言(为了可读性或团队规范)

如果你们团队要求必须显式写出断言逻辑,或者你觉得这样代码意图更清晰,可以用xUnit提供的Record.Exception方法来间接实现:

[Fact]
public void returns_json_response() 
{
    string results = execute("Batman");
    // 捕获执行委托时的异常,没有异常则返回null
    var exception = Record.Exception(() => 
        new JavaScriptSerializer().Deserialize<dynamic>(results)
    );
    // 断言异常为null,等同于原来的DoesNotThrow
    Assert.Null(exception);
}

补充说明

xUnit团队移除Assert.DoesNotThrow的原因是:这种断言本质上是冗余的——测试的默认行为已经覆盖了“无异常即通过”的逻辑,额外加断言只会让代码变得啰嗦。但如果确实有显式声明的需求,Record.Exception + Assert.Null就是官方推荐的替代方式。

内容的提问来源于stack exchange,提问作者Oli Weirdo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:34:33