Tôi đang thử nghiệm một phương thức cho một dịch vụ thực hiện API
cuộc gọi Web . Sử dụng một HttpClient
hoạt động bình thường tốt cho các thử nghiệm đơn vị nếu tôi cũng chạy dịch vụ web (nằm trong một dự án khác trong giải pháp) cục bộ.
Tuy nhiên, khi tôi kiểm tra các thay đổi của mình, máy chủ bản dựng sẽ không có quyền truy cập vào dịch vụ web nên các thử nghiệm sẽ thất bại.
Tôi đã nghĩ ra cách này để kiểm tra đơn vị của mình bằng cách tạo IHttpClient
giao diện và triển khai phiên bản mà tôi sử dụng trong ứng dụng của mình. Đối với các bài kiểm tra đơn vị, tôi tạo một phiên bản giả được hoàn thành với phương pháp đăng không đồng bộ giả. Đây là nơi tôi gặp vấn đề. Tôi muốn trả lại một OK HttpStatusResult
cho thử nghiệm cụ thể này. Đối với một bài kiểm tra tương tự khác, tôi sẽ trả lại một kết quả xấu.
Bài kiểm tra sẽ chạy nhưng sẽ không bao giờ hoàn thành. Nó treo ở chờ đợi. Tôi chưa quen với lập trình không đồng bộ, các đại biểu và chính Moq và tôi đã tìm kiếm SO và google trong một thời gian để học những điều mới nhưng dường như tôi vẫn không thể vượt qua vấn đề này.
Đây là phương pháp tôi đang thử nghiệm:
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
}
Đây là phương pháp kiểm tra đơn vị của tôi:
[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.");
}
Tôi đang làm gì sai?
Cảm ơn sự giúp đỡ của bạn.