Использование пакета Nuget MockHttpClient в VS 2017 - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь протестировать службу адаптера в VS 2017 в C #. Мой тест не пройден, потому что он требует ответа от 400 до 499 от HTTPClient. Когда мой тест запускается, сервис возвращает 500.

Итак, в процессе поиска я обнаружил пакет Nuget MockHttpClient, но приведенные примеры не работают, когда я пробую их в своем тесте.

Пример: https://github.com/codecutout/MockHttpClient/blob/master/README.md

Я получаю сообщение об ошибке

'MockHttpClient' является пространством имен, но используется как тип

Я также добавил using MockHTTPClient вверху моего теста.

Что я делаю не так?

получая ошибку с приведенным ниже

var mockHttpClient = new MockHttpClient();
mockHttpClient.When("the url I am using").Returns(HttpStatusCode.Forbidden)

1 Ответ

0 голосов
/ 05 января 2019

Это конфликт имен с пространством имен. Класс и пространство имен имеют одно и то же имя.

Удалите оператор using и используйте его вместо:

var mockHttpClient = new MockHttpClient.MockHttpClient();

Плохой выбор имен для этой библиотеки и ужасное количество зависимостей. Я бы держался подальше на твоем месте.

UPDATE:

Вы попросили альтернативу, поэтому вот что я недавно сделал для проекта:

Класс HttpClient имеет конструктор, который принимает объект HttpMessageHandler, так что вы можете передать свой собственный обработчик и смоделировать поведение.

Создайте класс, производный от DelegatingHandler и переопределяющий поведение отправки:

public class TestHandler : DelegatingHandler
{
    private Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> _handler;

    public TestHandler(Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> handler)
    {
        _handler = handler;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return _handler(request, cancellationToken);
    }

    public static Task<HttpResponseMessage> OK()
    {
        return Task.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.OK));
    }

    public static Task<HttpResponseMessage> BadRequest()
    {
        return Task.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.BadRequest));
    }
}

Затем в своем тесте вы используете ваш обработчик в конструкторе:

//Create an instance of the test handler that returns a bad request response
var testHandler = new TestHandler((r, c) =>
{                
    return TestHandler.BadRequest();
});

//Create the HTTP client
var client = new HttpClient(testHandler);

//Fake call, will never reach out to foo.com
var request = new HttpRequestMessage(HttpMethod.Get, "http://www.foo.com");
request.Content = new StringContent("test");

//This will call the test handler and return a bad request response
var response = client.SendAsync(request).Result;

Обратите внимание, у меня есть несколько удобных статических методов для создания для меня функций обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...