Saya menguji metode untuk layanan yang melakukan API
panggilan Web . Menggunakan normal HttpClient
berfungsi dengan baik untuk pengujian unit jika saya juga menjalankan layanan web (terletak di proyek lain dalam solusi) secara lokal.
Namun ketika saya memeriksa perubahan saya, build server tidak akan memiliki akses ke layanan web sehingga pengujian akan gagal.
Saya telah menemukan cara mengatasi ini untuk pengujian unit saya dengan membuat IHttpClient
antarmuka dan mengimplementasikan versi yang saya gunakan dalam aplikasi saya. Untuk pengujian unit, saya membuat versi tiruan lengkap dengan metode posting asinkron yang diejek. Di sinilah saya mengalami masalah. Saya ingin mengembalikan nilai OK HttpStatusResult
untuk tes khusus ini. Untuk tes serupa lainnya saya akan mengembalikan hasil yang buruk.
Tes akan berjalan tetapi tidak akan pernah selesai. Itu tergantung menunggu. Saya baru mengenal pemrograman asinkron, delegasi, dan Moq itu sendiri dan saya telah mencari SO dan google untuk sementara waktu mempelajari hal-hal baru tetapi saya masih belum bisa menyelesaikan masalah ini.
Inilah metode yang saya coba untuk menguji:
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
}
Inilah metode unit test saya:
[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.");
}
Apa yang saya lakukan salah?
Terima kasih untuk bantuannya.
sumber
ReturnsAysnc
, yang melakukan hal ini.Rekomendasikan @Stuart jawaban Grassie di atas.
sumber
Dengan
Mock.Of<...>(...)
untukasync
metode Anda dapat menggunakanTask.FromResult(...)
:sumber