Я пытаюсь использовать Moq для проверки ответа HTTP в модульном тесте.Я настроил свой макет, как показано ниже:
var mockHandler = new Mock<HttpMessageHandler>(MockBehavior.Strict);
mockHandler
.Protected()
// Sets up mock for the protected SendAsync method
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
// Prepare the expected response of the mocked HTTP call
.ReturnsAsync(new HttpResponseMessage() { StatusCode = System.Net.HttpStatusCode.OK, Content = new StringContent("{\"stuff\":[\""+expectedstuff+"\"]}"), })
.Verifiable();
Затем я создаю httpclient:
var client = new HttpClient(mockHandler.Object)
{
BaseAddress = new Uri(expectedRequestUri),
};
Затем я отправляю сообщение клиенту:
var response = await client.PostAsync("/path", new StringContent(""));
Когда я десериализирую ответ, он точно соответствует ложному ответу, который я настроил на шаге настройки выше, и все выглядит нормально.Тем не менее, на последнем шаге я столкнулся с проблемой, которая вызывает исключение (ниже) ...
mockHandler
.Protected()
.Verify(
"SendAsync",
Times.Exactly(1),
ItExpr.Is<HttpRequestMessage>(request => request.Method == HttpMethod.Post && request.RequestUri == new Uri(expectedRequestUri)),
ItExpr.IsAny<CancellationToken>());
Ошибка:
Moq.MockException: Ожидаемый вызов на макет точно1 раз, но было 0 раз: mock => mock.SendAsync(It.Is<HttpRequestMessage>(request => request.Method == HttpMethod.Post && request.RequestUri == new Uri(.expectedRequestUri)), It.IsAny<CancellationToken>())
Понятия не имею, почему он сообщает 0 раз, так как полученный ответ совпадает с поддельным ответом, поэтому он, кажется, функционирует.Любые мысли от сообщества будут полезны.