Web API
araması yapan bir hizmet için bir yöntem test ediyorum . HttpClient
Web hizmetini (çözümdeki başka bir projede bulunur) yerel olarak da çalıştırırsam, birim testleri için normal çalışır.
Ancak değişikliklerimi kontrol ettiğimde yapı sunucusunun web hizmetine erişimi olmayacak, bu yüzden testler başarısız olacak.
Bir IHttpClient
arayüz oluşturarak ve uygulamamda kullandığım bir sürümü uygulayarak birim testlerim için bir yol tasarladım . Birim testleri için, alaylı bir sürümü alay edilmiş bir asenkron post yöntemiyle tamamlıyorum. İşte burada sorunlarla karşılaştım. HttpStatusResult
Bu test için bir TAMAM dönmek istiyorum . Başka bir benzer test için kötü bir sonuç döndüreceğim.
Test devam edecek ancak asla tamamlanmayacak. Bekliyor. Eşzamansız programlama, delegeler ve Adedi'nin kendisi için yeniyim ve bir süredir yeni şeyler öğrenirken SO ve google'ı araştırıyorum, ancak yine de bu sorunu aşamıyorum.
İşte test etmeye çalıştığım yöntem:
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
}
İşte benim birim test yöntemi:
[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.");
}
Neyi yanlış yapıyorum?
Yardımın için teşekkürler.