/HttpClient.Helpers

Some simple System.Net.Http.HttpClient test helpers

Primary LanguageC#MIT LicenseMIT

HttpClient.Helpers

Lic: MIT

Stage CI NuGet
Production Build status NuGet Badge
Development Build status MyGet Badge

Code that uses System.Net.Http.HttpClient will attempt to actually call/hit that Http endpoint.

To prevent this from happening in a unit test, some simple helpers are provided in this code library.

Key Points

  • ✅ Hijack your httpClient request to return some hardcoded response (this library makes it supa dupa easy to do this)
  • ✅ Works with GET/POST/PUT/etc.
  • ✅ Can provide wildcards (i.e. I don't care about the Request endpoint or the request HTTP Method, etc)
  • ✅ Can provide multiple endpoints and see handle what is returned based on the particular request.
  • ✅ Can confirm the number of times an endpoint was attempted to be hit.
  • ✅ Can be used to test network errors during transmission. i.e. can test when the HttpClient throws an exception because of .. well ... 💥

Installation

Package Name: WorldDomination.HttpClient.Helpers
CLI: install-package WorldDomination.HttpClient.Helpers

TL;DR; Show me some code that leverages HttpClientFactory

What is HttpClientFactory? Read up about it here. You should be using that in your applications, peeps.

// Service that accepts an HttpClient so it has been setup to work nicely with HttpClientFactory.
public class MyService : IMyService
{ 
    public MyService(HttpClient httpClient)
    { .. }

    public async Task<string> GetWebApiStuffAsync() { .. }
}

// ** Now for a sample test **

// Act.

// Setup which http request 'stuff' you wish to capture and return.
// E.g. If we hit "this url" then return "this payload" and "this response type. 200 OK, etc".
var options = new HttpMessageOptions { ....};

// Create the fake handler with the specific options to check for.
var messageHandler = new FakeHttpMessageHandler(options);

// Now create a simple HttpClient which will use the fake handler to 
// cut short / capture the request.
var httpClient = new HttpClient(messageHandler);

var service = new MyService(httpClient);

// Act.
await service.GetWebApiStuffAsync();

Sample Code

There's plenty more examples about to wire up:

For all the samples, please check out the Wiki page: Helper Examples


Special Ackowledgements

A special and sincere thank you to David Fowler (@davidfowl) who explained how I should be unit testing the HttpClient class and gave me the guidence to make this library. I was soooo on the wrong path - and he guided me back on track.

Thank you David! 👌 🍸 👾


Summary

Finally, unit testing HttpClient is now awesome and simple!

Wohoo