我正在项目中使用新的 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/