В рамках проекта ASP.Net Core, над которым я работаю, у меня есть требование обмениваться информацией с несколькими различными конечными точками API на основе остатков из моего WebApi. Для этого я использую несколько классов обслуживания, каждый из которых создает экземпляр статического HttpClient. По сути, у меня есть класс обслуживания для каждой из конечных точек Rest, к которым подключается WebApi.
Пример того, как статический HttpClient в каждом из классов обслуживания, можно увидеть ниже.
private static HttpClient _client = new HttpClient()
{
BaseAddress = new Uri("http://endpointurlexample"),
};
Несмотря на то, что вышеперечисленное работает хорошо, оно не позволяет эффективно тестировать единицы обслуживания, использующие HttpClient. Чтобы позволить мне выполнять модульное тестирование, у меня есть поддельный HttpMessageHandler который я бы хотел использовать для HttpClient в своих модульных тестах, в то время как HttpClient как указано выше, однако я не могу применить поддельный HttpMessageHandler как часть моих модульных тестов.
Каков наилучший способ для HttpClient в классах обслуживания оставаться единственным экземпляром в приложении (один экземпляр на конечную точку), но разрешить применение другого HttpMessageHandler во время модульных тестов?
Один из подходов, о котором я думал, заключается не в использовании статического поля для хранения HttpClient в классах сервисов, а в том, чтобы позволить ему вводиться через HttpClient конструктора с использованием жизненного цикла singleton, что позволило бы мне указать HttpClient с требуемым HttpMessageHandler во время модульных тестов другой вариант, о котором я думал, должен был бы использовать HttpClient Factory Class, который HttpClient в статических полях, которые затем можно было бы получить, введя фабрику HttpClient в классы сервисов, снова разрешив другую реализацию с соответствующим HttpMessageHandler возвращаются в модульных тестах. Однако ни одно из вышеперечисленных чувств не является особенно чистым, и кажется, что должен быть лучший способ?
Любые вопросы, дайте мне знать.