Sto testando un metodo per un servizio che effettua una API
chiamata Web . L'uso normale HttpClient
funziona bene per i test unitari se eseguo anche il servizio Web (situato in un altro progetto nella soluzione) localmente.
Tuttavia, quando eseguo il check-in delle mie modifiche, il server di compilazione non avrà accesso al servizio Web, pertanto i test falliranno.
Ho escogitato un modo per aggirare questo per i test delle mie unità creando IHttpClient
un'interfaccia e implementando una versione che utilizzo nella mia applicazione. Per i test unitari, faccio una versione derisa completa di un metodo post asincrono deriso. Ecco dove ho riscontrato problemi. Voglio restituire un OK HttpStatusResult
per questo particolare test. Per un altro test simile restituirò un risultato negativo.
Il test verrà eseguito ma non verrà mai completato. È in attesa. Sono nuovo nella programmazione asincrona, i delegati e lo stesso Moq e ho cercato SO e google per un po 'di tempo imparando cose nuove, ma non riesco ancora a superare questo problema.
Ecco il metodo che sto cercando di testare:
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
}
Ecco il mio metodo di test unitario:
[TestMethod]
public async Task QueueNotificationAsync_Completes_With_ValidEmail()
{
Email email = new Email()
{
FromAddress = "bob@example.com",
ToAddress = "bill@example.com",
CCAddress = "brian@example.com",
BCCAddress = "ben@example.com",
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.");
}
Che cosa sto facendo di sbagliato?
Grazie per l'aiuto.