В этом подходе я создаю TestHandler и задаю его как свойство InnerHandler
тестируемого обработчика.
Затем тестируемый обработчик может быть передан в HttpClient
- это может показаться неинтуитивнымесли вы пишете обработчик на стороне сервера, но на самом деле это отличный легкий способ протестировать обработчик - он будет вызываться так же, как и на сервере.
TestHandler просто вернетHTTP 200 по умолчанию, но его конструктор принимает функцию, которую вы можете использовать, чтобы сделать утверждения о сообщении запроса, переданном из тестируемого обработчика.Наконец, вы можете сделать утверждения в результате вызова SendAsync от клиента.
После того, как все настроено, вызовите SendAsync
на экземпляре клиента, чтобы вызвать ваш обработчик.Запрос будет передан в ваш обработчик, он передаст его TestHandler (при условии, что он передает вызов), который затем вернет ответ вашему обработчику.
Обработчик теста выглядит следующим образом:
public class TestHandler : DelegatingHandler
{
private readonly Func<HttpRequestMessage,
CancellationToken, Task<HttpResponseMessage>> _handlerFunc;
public TestHandler()
{
_handlerFunc = (r, c) => Return200();
}
public TestHandler(Func<HttpRequestMessage,
CancellationToken, Task<HttpResponseMessage>> handlerFunc)
{
_handlerFunc = handlerFunc;
}
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
return _handlerFunc(request, cancellationToken);
}
public static Task<HttpResponseMessage> Return200()
{
return Task.Factory.StartNew(
() => new HttpResponseMessage(HttpStatusCode.OK));
}
}
Пример использования с воображаемым MyHandler
при испытании.Использует NUnit для утверждений .:
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://test.com");
httpRequestMessage.Headers.Add("username", "test");
var handler = new MyHandler()
{
InnerHandler = new TestHandler((r,c) =>
{
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));
Поведение TestHandler по умолчанию, вероятно, подходит для многих тестов и упрощает код.Настройка тестируемого обработчика выглядит следующим образом:
var handler = new MyHandler();
handler.InnerHandler = new TestHandler();
Мне нравится этот подход, потому что он сохраняет все утверждения в методе теста, а TestHandler
очень многократно используется.