我正在運行一套使用System.Net.HttpClient
的集成測試。在這些測試中的大多數我們的「行爲」部分的使用一般格式爲:如何使用System.Net.Http.HttpClient處理異步異常並進行集成測試?
// Arrange
// Do some stuff
// Act
var download = _client
.GetStringAsync(testUrl)
.Result;
// Assert
// Does "download" contain what I expected?
然而,運行這些測試間歇性地產生這樣的:
System.AggregateException : One or more errors occurred.
----> System.Threading.Tasks.TaskCanceledException : A task was canceled.
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task`1.get_Result()
我體會到使用HttpClient
是爲蹬掉的東西異步,並且不適合我們的集成測試場景,我們總是讓它等待。因此,這導致我兩塊有點相關的問題:
- 是使用
HttpWebRequest
/HttpWebResponse
更適合於這種情況? - 即使是這樣,使用
HttpClient
來處理異步啓動的請求錯誤的最佳方式是什麼?
你爲什麼以異步方式開始?似乎你想同步做到這一點......所以我會對第一個問題說「是」。對於問題#2,我會增加HttpClient類的'Timeout'屬性,除非您需要在特定時間範圍內測試響應性。無論哪種方式,我不知道爲什麼異步會更適合單元測試... – Tom
Httpclient只提供異步方法。 OP通過在任務上調用結果正確地將它們轉換爲同步調用。這也嚴格意味着這不是異步異常,它是在「結果」上阻塞之後引發的同步異常。我會嘗試增加超時時間 – aL3891