Mam zestaw testów integracji, które używają System.Net.HttpClient
. Większość naszych sekcjach „akt” w tych testach używać tego ogólnego wzoru:Jak mogę obsługiwać wyjątki asynchroniczne przy użyciu System.Net.Http.HttpClient z moimi testami integracji?
// Arrange
// Do some stuff
// Act
var download = _client
.GetStringAsync(testUrl)
.Result;
// Assert
// Does "download" contain what I expected?
Jednak prowadzenie tych badań sporadycznie daje coś takiego:
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()
Zdaję sobie sprawę, używając HttpClient
jest przeznaczona dla skopując rzeczy async i nie jest idealnie dopasowany do naszych scenariuszy testów integracyjnych, w których zawsze musimy czekać. Więc to prowadzi mnie do dwóch pytań, które są nieco powiązanych:
- Czy korzystanie
HttpWebRequest
/HttpWebResponse
bardziej odpowiedni dla tego scenariusza? - Nawet jeśli tak jest, to jaki jest najlepszy sposób pracy z
HttpClient
, aby obsługiwać błędy na prośbach uruchamianych asynchronicznie?
Dlaczego robisz to asynchronicznie na początek? Wygląda na to, że chcesz to zrobić synchronicznie ... więc powiedziałbym "tak", aby zadać pytanie nr 1. W przypadku pytania nr 2 zwiększyłbym właściwość 'Timeout' klasy HttpClient, chyba że musisz przetestować czas reakcji w określonym przedziale czasowym. Tak czy siak, nie jestem pewien, dlaczego async byłby lepiej przystosowany do testowania jednostkowego ... – Tom
Httpclient dostarcza tylko metody asynchroniczne. OP poprawnie konwertuje je do wywołań synchronicznych, wywołując Wynik w zadaniu. to również ściśle oznacza, że nie jest to wyjątek asynchroniczny, jest to wyjątek synchroniczny generowany po zablokowaniu na "Wynik". Spróbuję zwiększyć czas oczekiwania. – aL3891