NUnit异步委托测试异常行为:两种写法为何结果不同?
NUnit异步委托测试异常行为解析
这个问题的核心在于NUnit对不同委托类型的处理逻辑差异,咱们一步步拆解:
1. 先看失败的MyAsyncTest
你提前声明了TestDelegate类型的变量,而NUnit里的TestDelegate是一个同步无返回值的委托,它的定义大致是这样的:
public delegate void TestDelegate();
当你把async () => await MyTestMethod()这个异步lambda赋值给它时,编译器会把这个lambda转换成async void方法——因为TestDelegate要求返回void。而NUnit明确禁止用async void来写测试逻辑,因为async void的异常无法被框架正常捕获,还会导致线程生命周期混乱,所以直接抛出了ArgumentException提示你改用async Task。
2. 再看成功的MyAsyncTest2
这里你直接把异步lambda传给Assert.That,此时编译器会自动匹配NUnit提供的异步重载方法——也就是接受Func<Task>类型参数的那个版本。这个重载专门用来处理异步逻辑,NUnit会等待这个Task完成,然后再检查是否抛出了预期的异常,自然就能正常执行通过。
补充验证:手动指定正确委托类型也能成功
你可以试试把TestDelegate换成Func<Task>,这样第一个测试也能正常运行,代码如下:
[Test] // 现在会成功 public void MyAsyncTestFixed() { Func<Task> testDelegate = async () => await MyTestMethod(); Assert.That(testDelegate, Throws.Exception); }
总结一下:关键就是别用同步的TestDelegate来承载异步逻辑,要么用NUnit的异步断言重载,要么显式使用Func<Task>类型的委托。
内容的提问来源于stack exchange,提问作者dyedwiper
相关产品推荐
相关产品推荐

