簡體   English   中英

使用委托進行 NUnit 異步測試的奇怪行為

[英]Strange behavior of NUnit async test with delegate

我遇到了帶有異步委托的 NUnit 測試的奇怪行為。

我事先聲明委托的MyAsyncTestSystem.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM