Как выполнить модульное тестирование этой регистрации IoC с использованием именованных компонентов? (Autofac) - PullRequest
6 голосов
/ 28 ноября 2010

Я смотрю на преобразование некоторого нашего сложного кода создания для использования контейнера IoC, Autofac, и, поскольку я большой сторонник TDD, я пишу модульные тесты для конфигурации модуля.

Большую часть функциональности очень просто протестировать, например,

var obj = container.Resolve<IThing>();
Assert.IsInstanceOfType(obj, typeof(ThingImplementer));

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

builder.RegisterType<ThingImplementer>().Named<IThing>("Implementer1");
builder.RegisterType<OtherImplementer>().Named<IThing>("Implementer2");
builder.Register(c => new Foo(c.ResolveNamed<IThing>("Implementer1"))).As<IFoo>();

. Что я не могу понять, так это простой способ написания модульного теста, обеспечивающего получение Fing ThingImplementer, а не OtherImplementer.Мне интересно, стоит ли это усилий, у нас есть интеграционные тесты высокого уровня, которые покрывают это, но они не дают преимуществ документации и рефакторинга, которые делают юнит-тесты.

Вы бы написали юнит-тест?за это?Если да, то как?

Ответы [ 2 ]

7 голосов
/ 29 ноября 2010

Обычно вы не проверяете конфигурацию вашего контейнера в своих модульных тестах.В вашей среде модульного тестирования вы не используете контейнер для введения каких-либо зависимостей (вы делаете это вручную), и если вы сделаете это, вы бы добавили поддельные объекты, а не реальные / производственные типы.Поэтому конфигурация контейнера обычно не известна вашим модульным тестам.

Иногда я склонен проверять, способен ли контейнер создавать корневые типы приложения (такие как классы контроллеров приложения MVC илиКлассы страниц приложения WebForms).Поскольку контейнер будет создавать граф объектов, он даст мне хорошее представление о том, правильно ли настроен контейнер.Однако мне никогда не интересно, возвращает ли контейнер правильную реализацию.В большинстве случаев существует только одна реализация зарегистрированного интерфейса, доступная для корня приложения, поэтому она вряд ли может пойти не так.

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

2 голосов
/ 29 ноября 2010

Здесь нет ничего нового, только расширение баллов Стивена.

Как говорит Стивен, это определенно не модульный тест.Возможно, вы могли бы рассматривать это как учебный тест.Взгляните на набор тестов Ninject - он показывает, как они проводят такие тесты (но помните, что они пишут Контейнер).Я предполагаю, что у autofac есть похожие тесты.

Сказав, что, если вы чувствуете, что есть интересное поведение и оно не станет ненадежным, вставлять его в комплект интеграции не вредно.тот факт, что он является внешним, также очень важен - см. понятие Onion Architecture

...