【问题标题】:HttpConfiguration from System.Web.Http in .NET 5 project.NET 5 项目中 System.Web.Http 的 HttpConfiguration
【发布时间】:2021-02-17 08:31:00
【问题描述】:

更新:

完整的代码示例:

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

https://stackoverflow.com/a/54227679/3850405

为了让它工作,我需要以下行:

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,版本=v4.6.2,.NETFramework,版本=v4.7, .NETFramework,版本=v4.7.1, .NETFramework,版本=v4.7.2, .NETFramework,Version=v4.8' 代替项目目标框架 'net5.0'。此软件包可能与您的项目不完全兼容。

我已尝试安装下面推荐的Microsoft.AspNetCore.Mvc.WebApiCompatShim,但它不起作用。

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

https://stackoverflow.com/a/57279121/3850405

还有其他 NuGet 可以用来解决这个问题吗?

查看Microsoft.AspNet.WebApi.Core 的依赖关系,它仅依赖于Microsoft.AspNet.WebApi.Client,而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

【问题讨论】:

  • 我完全不明白为什么你需要使用HttpConfiguration 来模拟它。这是一种与 .NET Framework 的 ASP.NET MVC WEB API 相关的类型,您根本不需要在 .NET 5.0 应用程序中使用它。
  • @MartinCostello 如果您有更好的解决方案,我会全力以赴。
  • 如果您只需要一个模拟 IHttpClientFactory 并返回一个 HttpClient,那么我只需使用 Moq 创建一个,或者您可以自己滚动。它只有一种方法,HttpClient CreateClient(string)docs.microsoft.com/en-us/dotnet/api/…
  • @MartinCostello 我需要请求以返回预期结果,在示例中为 Hello World
  • 那么模拟 IHttpClientFactory__ 和 _HttpClient 还不够吗?在这种情况下,我将插入一个我自己为这类事情编写的库:github.com/justeat/…

标签: c# .net .net-5 system.web.http


【解决方案1】:

如果这是出于测试目的,我建议使用存根而不是模拟。 CreateClient 是一种扩展方法,不能那么容易地模拟。使用存根要容易得多。

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

根据您的代码,您可能无法将MyMyHttpClientFactory 注入您的模型。但是你应该考虑重构以使其更具可测试性。

【讨论】:

  • 我需要请求返回预期结果,在更新的示例中为Hello World
  • @Ogglas 这意味着您需要模拟 HttpClient,而不是 HttpClientFactory。您可以通过模拟 HttpClient 使用的 HttpClientHandler 来做到这一点。事实上,HttpClientFactory 已经有方法可以做到这一点。您可以使用此存根使用存根处理程序返回您自己的 HttpClient 实例,您已经这样做了
【解决方案2】:

我在.NET 5 中没有得到HttpConfiguration,所以我通过消除对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;
}

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多