Full source code available here.
In my previous post I showed a way of testing a controller that uses a HttpClient
.
I had to mock the HttpMessageHandler
pass that to the HttpClient
and set a bunch of properties. It works well, but is a bit long winded.
I received a comment from a reader who suggested that I try the JustEat.HttpClientInterception
library. It allows you to setup responses to specified requests, and pass these to a HttpClient
. Then the HttpClient
is passed to the controller.
Here is how the test method looks –
[Fact] public async Task GetTest() { //Arrange List<int> myList = new List<int>() {1, 2, 3, 4, 5}; // setup the interceptor HttpRequestInterceptionBuilder builder = new HttpRequestInterceptionBuilder() .ForHost("localhost.something.com") .ForPath("/v1/numbers") .WithJsonContent(myList); // create the HttpClient from the builder // and setup the HttpClientBaseAddress HttpClient client = new HttpClientInterceptorOptions() .Register(builder).CreateHttpClient("http://localhost.something.com/v1/"); ValuesController controller = new ValuesController(client); //Act IActionResult result = await controller.Get(); //Assert OkObjectResult resultObject = result as OkObjectResult; Assert.NotNull(resultObject); List<int> numbers = resultObject.Value as List<int>; Assert.Equal(5, numbers.Count); }
Briefly, here is the constructor of the values controller. It takes the HttpClient
as a parameter, usually passed by dependency injection.
public class ValuesController : Controller { readonly IAsyncPolicy<HttpResponseMessage> _httpRetryPolicy; private readonly HttpClient _httpClient; public ValuesController(HttpClient httpClient) { _httpClient = httpClient; } //snip..
Full source code available here.