Я испытываю трудности с настройкой DI с помощью SimpleInjector (4.9) в моем приложении ASP. NET Core 3.1 для моих интеграционных тестов, чтобы я мог поменять зависимости настроенными службами, зарегистрированными в классе запуска. в соответствии со стандартом ASP. NET Базовая конфигурация запуска.
То, чего я хочу достичь, в основном примерно так:
- Использовать Microsoft.AspNetCore.TestHost.TestServer (или эквивалентно «хосту» теста
- Инициализируйте автозагрузку как «нормальную», поэтому нет необходимости поддерживать отдельные IoC для тестирования и выполнения
- Замена / переопределение ключевых зависимостей с помощью mock, например API вызовы внешних служб и RabbitMQ
- Выполнение тестов с использованием конфигурации запуска с 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 )
Я загрузил образец репозитория здесь , который показывает проблему (и) ); некоторые рекомендации здесь будут с благодарностью.