HttpConfiguration из System.Web.Http в проекте .NET 5

Обновлять:

Пример полного кода:

      public class DelegatingHandlerStub : DelegatingHandler {
    private readonly Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> _handlerFunc;
    public DelegatingHandlerStub() {
        _handlerFunc = (request, cancellationToken) => Task.FromResult(request.CreateResponse(HttpStatusCode.OK));
    }

    public DelegatingHandlerStub(Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> handlerFunc) {
        _handlerFunc = handlerFunc;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        return _handlerFunc(request, cancellationToken);
    }
}

public async Task Should_Return_Ok() {
    //Arrange
    var expected = "Hello World";
    var mockFactory = new Mock<IHttpClientFactory>();
    var configuration = new HttpConfiguration();
    var clientHandlerStub = new DelegatingHandlerStub((request, cancellationToken) => {
        request.SetConfiguration(configuration);
        var response = request.CreateResponse(HttpStatusCode.OK, expected);
        return Task.FromResult(response);
    });
    var client = new HttpClient(clientHandlerStub);
    
    mockFactory.Setup(_ => _.CreateClient(It.IsAny<string>())).Returns(client);
    
    IHttpClientFactory factory = mockFactory.Object;
    
    var controller = new ValuesController(factory);
    
    //Act
    var result = await controller.Get();
    
    //Assert
    result.Should().NotBeNull();
    
    var okResult = result as OkObjectResult;
    
    var actual = (string) okResult.Value;
    
    actual.Should().Be(expected);
}

Оригинал:

Я следую этому руководству, чтобы поиздеваться IHttpClientFactory.

/questions/41820628/kak-smodelirovat-novyij-httpclientfactory-vnet-core-21-ispolzuya-moq/41820639#41820639

Для работы мне нужна следующая строка:

      var configuration = new HttpConfiguration();

Исправление Visual Studios: Install package 'Microsoft.AspNet.WebApi.Core'.

Это работает, и код работает нормально, но я получаю следующее предупреждение:

Предупреждение NU1701 Пакет «Microsoft.AspNet.WebApi.Core 5.2.7» был восстановлен с помощью .NETFramework,Version = v4.6.1, .NETFramework,Version = v4.6.2, .NETFramework,Version = v4.7, .NETFramework,Version = v4.7.1, .NETFramework,Version = v4.7.2, .NETFramework,Version = v4.8'вместо целевой платформы проекта' net5.0 '. Этот пакет может быть не полностью совместим с вашим проектом.

Я пробовал установить Microsoft.AspNetCore.Mvc.WebApiCompatShim это было рекомендовано ниже, но это не работает.

https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.WebApiCompatShim

/questions/48870426/systemwebhttp-otsutstvuet-vnet-core-21/50472314#50472314

Есть ли другой NuGet, который можно использовать для решения этой проблемы?

Рассматривая зависимости для Microsoft.AspNet.WebApi.Core это зависит только от Microsoft.AspNet.WebApi.Client что, в свою очередь, использует .NETStandard 2.0. В идеале я бы не хотел создавать новый проект, ориентированный на .NET Standard 2.0и поместите туда код. Я хотел бы использовать .NET 5 проект.

https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Core/

https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/

https://docs.microsoft.com/en-us/dotnet/standard/net-standard

2 ответа

Я не попал .NET 5 поэтому я решил это, устранив необходимость в HttpConfiguration так:

      private LoginController GetLoginController()
{
    var expected = "Hello world";
    var mockFactory = new Mock<IHttpClientFactory>();

    var mockMessageHandler = new Mock<HttpMessageHandler>();
    mockMessageHandler.Protected()
        .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
        .ReturnsAsync(new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            Content = new StringContent(expected)
        });

    var httpClient = new HttpClient(mockMessageHandler.Object);

    mockFactory.Setup(_ => _.CreateClient(It.IsAny<string>())).Returns(httpClient);

    var logger = Mock.Of<ILogger<LoginController>>();

    var controller = new LoginController(logger, mockFactory.Object);

    return controller;
}

Если это сделано для тестирования, я предлагаю использовать заглушку вместо имитации.CreateClient - это метод расширения, и над ним не так просто издеваться. Использовать заглушку намного проще.

      public class MyHttpClientFactory : IHttpClientFactory
{
    public HttpClient CreateClient(string name)
    {
        return new HttpClient();
    }
}

В зависимости от вашего кода у вас могут возникнуть проблемы с введением MyMyHttpClientFactory

в вашу модель. Но тогда вам следует подумать о рефакторинге, чтобы сделать его более тестируемым.
Другие вопросы по тегам