В рамках проекта 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
возвращаются в модульных тестах. Однако ни одно из вышеперечисленных чувств не является особенно чистым, и кажется, что должен быть лучший способ?
Любые вопросы, дайте мне знать.