You can unit test a class that uses HttpClient by giving
that HttpClient a mock HttpMessageHandler. This way, you can capture the
request and prevent it from actually going over the wire.
Here is an example using Moq. HttpClient depends on
HttpMessageHandler’s SendAsync() method, so give SendAsync() a stub
implementation and use Moq’s Callback() to capture arguments.
var handler = new Mock<HttpMessageHandler>();
handler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.Returns(Task<HttpResponseMessage>.Factory.StartNew(()
=>
{
return new HttpResponseMessage(HttpStatusCode.OK);
}))
.Callback<HttpRequestMessage, CancellationToken>((r, c) =>
{
Assert.AreEqual(HttpMethod.Get, r.Method);
});
using (var client = new HttpClient(handler.Object))
{
var request = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com");
var response =
client.SendAsync(request).Result;
Console.WriteLine(response.StatusCode);
}