[英]WPF Dispatcher.InvokeAsync() strange behavior with async delegate
[英]Strange behavior of NUnit async test with delegate
我遇到了帶有異步委托的 NUnit 測試的奇怪行為。
我事先聲明委托的MyAsyncTest
因System.ArgumentException : Async void methods are not supported. Please use 'async Task' instead.
失敗System.ArgumentException : Async void methods are not supported. Please use 'async Task' instead.
System.ArgumentException : Async void methods are not supported. Please use 'async Task' instead.
我在其中粘貼委托的MyAsyncTest2
通過了。
[Test] //fails
public void MyAsyncTest()
{
TestDelegate testDelegate = async () => await MyTestMethod();
Assert.That(testDelegate, Throws.Exception);
}
[Test] //passes
public void MyAsyncTest2()
{
Assert.That(async () => await MyTestMethod(), Throws.Exception);
}
private async Task MyTestMethod()
{
await Task.Run(() => throw new Exception());
}
有人可以解釋一下嗎?
這里的問題在於異步 void 回調。
由於 'MyAsyncTest1' 使用TestDelegate並且它返回 void(它變成 async void),它不能正確處理異常。
如果您在 'MyAsyncTest2' 測試中注意參數類型是 ActualValueDelegate 和 Task 返回類型(意味着異常將被正確處理)。
要解決此問題,您必須明確指定返回類型為 Task。 請參閱提供的示例。
public class Tests
{
[Test]
public void MyAsyncTest()
{
Func<Task> testDelegate = async () => await MyTestMethod();
Assert.That(testDelegate, Throws.Exception);
}
private async Task MyTestMethod()
{
await Task.Run(() => throw new Exception());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.