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
相关产品推荐
相关产品推荐

