Если вы не используете ActivatorFactory
для своего приложения (и вы не должны использовать его, если используете инверсию управления), удалите его и подумайте, что вы пытаетесь проверить .
- Вы пытаетесь проверить, что обычно вы можете просто разрешить проблемы с помощью Autofac? Autofac имеет множество модульных тестов, а также миллионы успешных пользователей. Нет смысла в тестировании фреймворка.
- Вы пытаетесь проверить, что вы зарегистрировали все, что вам нужно было зарегистрировать? В этом тоже нет особой ценности по нескольким причинам: во-первых, вы получите это в время выполнения довольно быстро и увидеть это в тех тестах; во-вторых, в большой разобщенной системе эти тесты действительно быстро устаревают. Это хлопоты по обслуживанию.
- Вы пытаетесь проверить, что конкретный граф объектов может быть составлен на основе ваших регистраций? Я мог бы купить этот. Смотри ниже.
Допустим, это последнее - у вас есть действительно сложный и проблемный граф объектов, который вы хотите создать, потому что люди продолжают его ломать. Я мог видеть это.
Разделите ваши регистрации в модуле Autofac. Для проверки используйте модуль Autofac.
public class MyRegistrations : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<Thing>();
// and all your other registrations.
}
}
затем в модульном тесте
var builder = new ContainerBuilder();
builder.RegisterModule<MyRegistrations>();
var container = builder.Build();
var thing = container.Resolve<Thing>();
// Assert on the resolved thing.
Вы можете использовать этот же модуль для инкапсуляции ваших регистраций в приложении, и тогда вы фактически будете тестировать сложную регистрацию, но без фабрики, которую вы не используете.
Предупреждение. Это скользкий путь между тестированием сложной регистрации и тестированием всех регистраций. Как я уже сказал, вы действительно не хотите тестировать каждую вашу регистрацию. Я упал с этого склона. Это кошмар обслуживания. Добавьте регистрацию в модуль / приложение, добавьте тест. О, мы сделали рефакторинг, теперь все регистрации разные. Тьфу. Это меньше проверяет поведение, чем характеристику (не «что я хочу сделать», а «что он делает сейчас»). Боль. Страдание.
Если вы используете ActivatorFactory
в своем приложении , скажем, для определения местоположения службы, вместо использования более стандартной вещи, такой как CommonServiceLocator , которая уже делает это для вас и для которого Autofac уже напрямую интегрирует ... тогда просто протестируйте ActivatorFactory
с реальным контейнером, но с некоторыми произвольными тестовыми регистрациями, а не со всем набором из реального приложения. Функциональность ActivatorFactory
не имеет никакого отношения к тому, что зарегистрировано внутри него .
И, да, если вы используете ActivatorFactory
и вам нужно его сохранить, вам придется вручить его ILifetimeScope
при запуске приложения. Вот так работают сервисные локаторы. Все это вы увидите в документах Autofac , когда вы посмотрите, как интегрировать приложения, такие как ASP.NET, WCF и другие.