Uso de Moq para simular un método asíncrono para una prueba unitaria
Estoy probando un método para un servicio que hace una web.API
llamada. Usando un normalHttpClient
funciona bien para pruebas unitarias si también ejecuto el servicio web (ubicado en otro proyecto en la solución) localmente.
Sin embargo, cuando verifico mis cambios, el servidor de compilación no tendrá acceso al servicio web, por lo que las pruebas fallarán.
He ideado una forma de evitar esto para mis pruebas de unidad creando unIHttpClient
Interfaz e implementación de una versión que uso en mi aplicación. Para las pruebas unitarias, hago una versión simulada completa con un método posterior asíncrono simulado. Aquí es donde me he encontrado con problemas. Quiero devolver un OKHttpStatusResult
para esta prueba particular. Para otra prueba similar devolveré un mal resultado.
La prueba se ejecutará pero nunca se completará. Se cuelga en la espera. Soy nuevo en la programación asíncrona, los delegados y el propio Moq, y he estado buscando SO y google durante un tiempo aprendiendo cosas nuevas, pero todavía no puedo superar este problema.
Aquí está el método que estoy tratando de probar:
public async Task<bool> QueueNotificationAsync(IHttpClient client, Email email)
{
// do stuff
try
{
// The test hangs here, never returning
HttpResponseMessage response = await client.PostAsync(uri, content);
// more logic here
}
// more stuff
}
Aquí está mi método de prueba de unidad:
[TestMethod]
public async Task QueueNotificationAsync_Completes_With_ValidEmail()
{
Email email = new Email()
{
FromAddress = "[email protected]",
ToAddress = "[email protected]",
CCAddress = "[email protected]",
BCCAddress = "[email protected]",
Subject = "Hello",
Body = "Hello World."
};
var mockClient = new Mock<IHttpClient>();
mockClient.Setup(c => c.PostAsync(
It.IsAny<Uri>(),
It.IsAny<HttpContent>()
)).Returns(() => new Task<HttpResponseMessage>(() => new HttpResponseMessage(System.Net.HttpStatusCode.OK)));
bool result = await _notificationRequestService.QueueNotificationAsync(mockClient.Object, email);
Assert.IsTrue(result, "Queue failed.");
}
¿Qué estoy haciendo mal?
Gracias por tu ayuda.