Как поменять зависимость с помощью Simple Injector в ASP. NET Core 3.1 для интеграционных тестов - PullRequest
0 голосов
/ 24 февраля 2020

Я испытываю трудности с настройкой DI с помощью SimpleInjector (4.9) в моем приложении ASP. NET Core 3.1 для моих интеграционных тестов, чтобы я мог поменять зависимости настроенными службами, зарегистрированными в классе запуска. в соответствии со стандартом ASP. NET Базовая конфигурация запуска.

То, чего я хочу достичь, в основном примерно так:

  1. Использовать Microsoft.AspNetCore.TestHost.TestServer (или эквивалентно «хосту» теста
  2. Инициализируйте автозагрузку как «нормальную», поэтому нет необходимости поддерживать отдельные IoC для тестирования и выполнения
  3. Замена / переопределение ключевых зависимостей с помощью mock, например API вызовы внешних служб и RabbitMQ
  4. Выполнение тестов с использованием конфигурации запуска с mocks

Моя проблема заключается в том, что я не могу найти способ взаимодействия с контейнером SI, чтобы получить его переопределить зависимости, подобно тому, как Адам Сторр решил это . Я пытался черпать вдохновение из руководств, опубликованных Адамом Сторром, Эндрю Локом, Гуннаром Пейпманом и, конечно же, официальными документами, но, как бы я ни пытался объединить решения с SimpleInjector, всегда есть что-то критическое, что не работает.

Я не могу получить доступ к Контейнеру, созданному в Startup, и заставить его изменить зависимости, так как Startup генерируется .UseStartup, и даже тогда это будет означать разоблачение класса Startup каким-то запутанным способом. Я также не могу вставить контейнер в автозагрузку, поскольку больше не поддерживается .

Но если я пытаюсь создать подкласс Startup и использую его, я сталкиваюсь с проблемой, что Controllers не могут быть найдены по умолчанию, и поэтому Http (Test) Client возвращает 404. И если я попытаюсь решить эту проблему в соответствии с предложением Гуннара Пейпмана SimpleInjector завершится ошибкой с:

System.InvalidOperationException : For the SimpleInjectorControllerActivator to function properly, it requires all controllers to be registered explicitly in Simple Injector, but a registration for WeatherForecastController is missing. To ensure all controllers are registered properly, call the RegisterMvcControllers extension method on the Container from within your Startup.Configure method while supplying the IApplicationBuilder instance, e.g. "this.container.RegisterMvcControllers(app);"

(что даже не актуально способ решить эту проблему, так как RegisterMvcControllers (app) устарел в пользу AddControllerActivation - ref )

Я загрузил образец репозитория здесь , который показывает проблему (и) ); некоторые рекомендации здесь будут с благодарностью.

1 Ответ

1 голос
/ 25 февраля 2020

После дальнейших копаний я обнаружил проблему, которая помешала всем моим попыткам работать: чтобы ваш интеграционный тест регистрировал контроллеры, вы должны изменить тестовый проект SDK с:

<Project Sdk="Microsoft.NET.Sdk">

на:

<Project Sdk="Microsoft.NET.Sdk.Web">

И, честно говоря, это действительно так при предварительных условиях , но, честно говоря, я думаю, что странно, что шаблоны тестового проекта не идут с этим уже настроенным, или что для этого - очень распространенного - сценария нет специального c шаблона, или что ни одно из найденных руководств не упоминает этот критический фрагмент конфигурации. Это очень легко пропустить, если вы доверяете шаблонам.

Теперь, когда это исправлено, довольно просто использовать подкласс Startup с переопределенными переопределениями с помощью SimpleInjector.

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