.NET: HttpClient mocking it with my Interface IHttpClient, but there is an internal object that is NULL and it is sealed
Just inject the concrete HttpClient and mock the underlying HttpMessageHandler...
http://geekswithblogs.net/abhi/archive/2013/11/20/unit-tests-for-httpclient-using-httpmessagehandler.aspx
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); }
HttpRequestHeaders
has only internal constructor.
But you can do it by creating HttpRequestMesssage
object:
var message = new HttpRequestMessage();
.Setup(x => x.DefaultRequestHeaders).Returns(message.Headers);