Как проверить, что все необходимые сервисы были зарегистрированы в коллекции сервисов DI - PullRequest
0 голосов
/ 24 января 2019

В файле запуска приложения ASP.NET Core мы регистрируем сотни различных сервисов.
Во время рефакторинга некоторые сервисы были перенесены в выделенные проекты, а их регистрации были обернуты методами расширения для IServiceCollection.
Некоторые сервисы были сгруппированы по доменной логике и дереву зависимостей, и их регистрация была перенесена также в методы расширения.

Я думал, есть ли способ проверить, что все необходимые услуги зарегистрированы в DI?

Поскольку это веб-приложение и все точки входа в приложение являются контроллерами. После выполнения Startup.ConfigureServices можно было бы просто создать экземпляры всех контроллеров с набором сервисов, но я не получил его в модульных тестах.

В качестве результата теста я был бы рад убедиться, что все контроллеры были успешно созданы.

1 Ответ

0 голосов
/ 24 января 2019

Не пробовал это, но в основном вам нужно позвонить в службу регистрации, а затем получить контроллер из этого.Если необходимые службы, необходимые для активации контроллера, отсутствуют, он должен выдать InvalidOperationException, который вы можете проверить.

Однако по умолчанию сами контроллеры фактически не зарегистрированы в коллекции служб.Есть способ сделать это, но использовать его только для включения тестирования - плохая идея.Вместо этого вам следует просто положиться на IControllerActivator:

var services = // call method that registers services;
var provider = services.Build();

var activator = provider.GetRequiredService<IControllerActivator>();
var context = new ControllerContext { ... };
var controller = activator.Create(context);

// assert something useful

ControllerContext - это то, что сообщает активатору, какой контроллер создать, и какой метод действия вызвать.Таким образом, вам нужно будет смоделировать это с информацией, необходимой для каждого конкретного контроллера.

...