Ответ 1
В этом подходе я создаю 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
очень многократно используется.