Могу ли я издеваться над вызовом httpClient.PostAsync () без оболочки? - PullRequest
0 голосов
/ 19 декабря 2018

Я использую Moq для написания тестов и могу смоделировать HttpClientHandler для вызова GetAsync (), но когда я пытаюсь смоделировать PostAsync (), он возвращает null.Есть ли способ смоделировать эту функциональность, не создавая обертку вокруг всего HttpClient?

Ниже приведен мой код модульного теста для подделки функции.

Mock<WebProxy> mockWebProxy = new Mock<WebProxy>();
        mockWebProxy.Object.Address = new Uri(configuration.GetSection("TestProxy").Value);
        mockWebProxy.Object.UseDefaultCredentials = true;
        Mock<HttpClient> mockHttpClient = new Mock<HttpClient>();
        var mockHttpClientHandler = new Mock<HttpClientHandler>();
        mockHttpClientHandler.Object.Proxy = mockWebProxy.Object;
        mockHttpClientHandler
            .Protected()
            .Setup<Task<HttpResponseMessage>>(
                "SendAsync",
                ItExpr.IsAny<HttpRequestMessage>(),
                ItExpr.IsAny<CancellationToken>()
            )
            .ReturnsAsync(new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                Content = new StringContent("this is a test")
            })
            .Verifiable();
        mockHttpClient = new Mock<HttpClient>(mockHttpClientHandler.Object, true);

Тогда я вызываю PostAsync ():

var response = await httpClient.PostAsync(new Uri(url), stringContent);

PostAsync () работает, когда не насмехается над httpClient.Но при издевательстве ответ выше нулевой.Это говорит мне о том, что используется смоделированный HttpClient, поскольку ответа нет, но я не уверен, почему он пуст, а не смоделированное HttpResponseMessage, которое работает для GetAsync ().

1 Ответ

0 голосов
/ 19 декабря 2018

Вам понадобится оболочка.

Ваша настройка для SendAsync, которая является виртуальной в базовом классе HttpMessageInvoker и поэтому может быть переопределена, но вы звоните PostAsync, которая являетсяобщедоступный и не подлежащий переопределению.

Крутая вещь в HttpClient - когда вы ее заверните, ее можно будет использовать повторно.Выкрой пулю (если сможешь) и заверни ее.:-)

...