Модульное тестирование внешнего HTTP-запроса в. NET - PullRequest
0 голосов
/ 13 июля 2020

У меня есть следующий метод:

  private async Task<Result> TryGetResult (string request)
        {
            var httpClient = new HttpClient(); 
            var result = await httpClient.GetAsync(request);
            if (result.IsSuccess)
            {
                var body = await result.Content.ReadAsStringAsync();
                var deserializedResult = JsonConvert.DeserializeObject<Result>(body);
                return deserializedResult ;
            }

            if ( result.StatusCode == (HttpStatusCode)429 )
            {
                await Task.Delay(TimeSpan.FromSeconds(1));
                return await TryGetResult(request);
            }
        }

Это принимает этот строковый запрос: var request = $"https://atlas.microsoft.com/search/address/json ... //(private keys omitted)

Я хочу провести модульное тестирование метода и заглушить запрос, чтобы я не не звонить по-настоящему. У меня ограниченный опыт модульного тестирования C#, и я изо всех сил пытаюсь понять, как его заглушить? Пожалуйста, может ли кто-нибудь указать мне в правильном направлении?

Я пробовал просматривать похожие статьи и поискать в Google, но не могу найти заглушку строкового запроса, подобного этому, и задаюсь вопросом, не иду ли я в неправильном направлении, пытаясь тест?

1 Ответ

1 голос
/ 13 июля 2020

Вы должны разрешить внедрение HttpClient из конструктора класса, содержащего TryGetResult

public class YourClass // might want to implement IDisposable?
{
    private readonly HttpClient _client;

    public YourClass()
       : this(new HttpClient());
    {
    }

    public YourClass(HttpClient client)
    {
        _client = client ?? throw new ArgumentNullException(nameof(client));
    }
}

Оттуда я бы предложил издеваться над HttpClient с помощью RichardSzalay.MockHttp . Таким образом, вы можете контролировать полный ответ.

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