作为@Raj 已经提出的优秀想法的替代方案,可以降低一步并模拟/伪造它HttpMessageHandler
。
如果你在构造函数中让任何需要HttpClient
接受它作为依赖注入参数的类,那么在单元测试时你可以传入一个HttpClient
已经注入你自己的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));
}
}
我的简单示例只是将 in 保存HttpRequestMessage
在公共属性中以供以后检查并返回 HTTP 200(OK),但是您可以通过添加一个设置您想要返回的结果的构造函数来增加它。
你会像这样使用这个类:
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
s 的方法中,假处理程序可能开始变得过于复杂。但是,对于简单的情况可能值得考虑。