Ложные ответы работают, но проверка не проходит - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь использовать 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 раз, так как полученный ответ совпадает с поддельным ответом, поэтому он, кажется, функционирует.Любые мысли от сообщества будут полезны.

1 Ответ

0 голосов
/ 08 февраля 2019

В подобных ситуациях вы должны проверить выражение, используемое в Verify.

Очевидно, что он не соответствует тому, что было вызвано.

Если базовый адрес клиента равен expectedRequestUri

var client = new HttpClient(mockHandler.Object)
{
    BaseAddress = new Uri(expectedRequestUri), //<--
};

и сообщение выполняется с помощью /path

var response = await client.PostAsync("/path", new StringContent("")); //<--

тогда URL-адрес запроса будет объединением двух.

Но при проверке вы проверяете

request.RequestUri == new Uri(expectedRequestUri)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...