Estoy ejecutando un conjunto de pruebas de integración que usan System.Net.HttpClient
. La mayor parte de nuestras secciones "Ley" en estas pruebas utilizan este formato general:¿Cómo puedo manejar excepciones asíncronas usando System.Net.Http.HttpClient con mis pruebas de integración?
// Arrange
// Do some stuff
// Act
var download = _client
.GetStringAsync(testUrl)
.Result;
// Assert
// Does "download" contain what I expected?
Sin embargo, la ejecución de estas pruebas de forma intermitente produce algo como esto:
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()
Soy consciente usando HttpClient
se entiende por dando inicio a las cosas asincrónico y no es perfecto para nuestros escenarios de prueba de integración donde siempre le pedimos que espere. Así que esto me lleva a dos preguntas que son de alguna manera relacionado:
- Es usar
HttpWebRequest
/HttpWebResponse
más apropiado para este escenario? - Incluso si lo es, ¿cuál es la mejor manera de trabajar con
HttpClient
para manejar los errores en las solicitudes iniciadas de forma asincrónica?
¿Por qué estás haciendo esto de forma asíncrona para empezar? Parece que querrías hacerlo sincrónicamente ... así que diría que sí a la pregunta n. ° 1. Para la pregunta n. ° 2, aumentaría la propiedad 'Timeout' de la clase HttpClient, a menos que sea necesario probar la capacidad de respuesta dentro de un determinado período de tiempo. De cualquier forma, no estoy seguro de por qué la sincronización sería más adecuada para las pruebas unitarias ... – Tom
Httpclient solo proporciona métodos asíncronos. OP está convirtiéndolos correctamente en llamadas sincrónicas llamando a Result en la tarea. esto también estrictamente hablando significa que esta no es una excepción asíncrona, es una excepción sincrónica lanzada después del bloqueo en "Resultado". Intentaría aumentar el tiempo de espera – aL3891