Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>In this approach, I create a TestHandler and set it as the <code>InnerHandler</code> property of the handler under test.</p> <p>The handler under test can then be passed to an <code>HttpClient</code> - this may seem unintuitive if you are writing a server-side handler, but this is actually a great light-weight way to test a handler - it will be called in the same way it would in a server.</p> <p>The TestHandler will just return an HTTP 200 by default, but it's constructor accepts a function you can use to make asserts about the request message passed in from the handler under test. Finally you can make asserts on the result of the SendAsync call from the client.</p> <p>Once everything is set up, call <code>SendAsync</code> on the client instance to invoke your handler. The request will be passed into your handler, it will pass this on to the TestHandler (assuming it passes the call on) which will then return a response back to your handler.</p> <p>The test handler looks like this:</p> <pre><code>public class TestHandler : DelegatingHandler { private readonly Func&lt;HttpRequestMessage, CancellationToken, Task&lt;HttpResponseMessage&gt;&gt; _handlerFunc; public TestHandler() { _handlerFunc = (r, c) =&gt; Return200(); } public TestHandler(Func&lt;HttpRequestMessage, CancellationToken, Task&lt;HttpResponseMessage&gt;&gt; handlerFunc) { _handlerFunc = handlerFunc; } protected override Task&lt;HttpResponseMessage&gt; SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { return _handlerFunc(request, cancellationToken); } public static Task&lt;HttpResponseMessage&gt; Return200() { return Task.Factory.StartNew( () =&gt; new HttpResponseMessage(HttpStatusCode.OK)); } } </code></pre> <p>Example usage with an imagined <code>MyHandler</code> under test. Uses NUnit for the asserts.:</p> <pre><code>var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://test.com"); httpRequestMessage.Headers.Add("username", "test"); var handler = new MyHandler() { InnerHandler = new TestHandler((r,c) =&gt; { Assert.That(r.Headers.Contains("username")); return TestHandler.Return200(); }) }; var client = new HttpClient(handler); var result = client.SendAsync(httpRequestMessage).Result; Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK)); </code></pre> <p>The default behaviour of TestHandler is probably fine for many tests and makes the code simpler. The setup of the handler under test then looks like this:</p> <pre><code>var handler = new MyHandler(); handler.InnerHandler = new TestHandler(); </code></pre> <p>I like this approach because it keeps all the assertions in the test method, and the <code>TestHandler</code> is very reusable.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload