c# - stub 或模拟 ASP.NET Web API HttpClient

标签 c# unit-testing dotnet-httpclient rhino-mocks

我正在项目中使用新的 Web API 位,但我发现我无法使用正常的 HttpMessageRequest,因为我需要将客户端证书添加到请求中。因此,我使用 HttpClient (因此我可以使用 WebRequestHandler)。这一切都运行良好,只是它对 stub /模拟不友好,至少对于 Rhino Mocks 来说是这样。

我通常会围绕 HttpClient 创建一个包装器服务来代替它,但如果可能的话,我想避免这种情况,因为我需要包装很多方法。我希望我遗漏了一些东西 - 关于如何 stub HttpClient 有什么建议吗?

最佳答案

作为 @Raj 已经提出的优秀想法的替代方案,可以降低一步并模拟/伪造 HttpMessageHandler

如果您让任何需要 HttpClient 的类在构造函数中接受它作为依赖项注入(inject)参数,那么在单元测试时您可以传入一个已被配置的 HttpClient注入(inject)您自己的HttpMessageHandler。这个简单的类只有一个您需要实现的抽象方法,如下所示:

public class FakeHttpMessageHandler : HttpMessageHandler
    {
    public HttpRequestMessage RequestMessage { get; private set; }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
        RequestMessage = request;
        return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));
        }
    }

我的简单示例只是将 HttpRequestMessage 保存在公共(public)属性中以供以后检查并返回 HTTP 200(正常),但您可以通过添加一个构造函数来设置您想要返回的结果来增强此功能。

你可以像这样使用这个类:

public void foo()
    {
    //Arrange
    var fakeHandler = new FakeHttpMessageHandler();
    var client = new HttpClient(fakeHandler);
    var SUT = new ClassUnderTest(client);

    //Act
    SUT.DomSomething();

    //Assert
    fakeHandler.RequestMessage.Method.ShouldEqual(HttpMethod.Get); // etc...
    }

这种方法存在局限性,例如在发出多个请求或需要创建多个 HttpClient 的方法中,那么假处理程序可能会开始变得过于复杂。但是,对于简单的情况可能值得考虑。

关于c# - stub 或模拟 ASP.NET Web API HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10693955/

相关文章:

c# - 通用 Windows 平台 (UWP) 相当于获取主应用程序 UI

c# - 在 Powershell 中使用 IEnumerable<string> 类型的参数调用 C# 方法

c# - Windows 7 中的断电事件...C# 问题

C#单元测试,如何测试大于

java - 运行 JUnit 测试时出错(JPA、Derby、Hibernate、Guice)

c# - 为 gRPC 客户端创建接口(interface)以进行单元测试

c# - 为 HttpClient 中的 Get 操作显式设置内容类型 header

c# - Winforms Propertygrid 中的验证

c# - 比较请求中的属性是否具有相等的值 C#