Я пытаюсь использовать Castle Windsor в своих автоматизированных тестах так:
В каждом тесте:
- Функция
Setup()создает контейнер Windsor, регистрируя стандартные реализации каждого компонента - Функция
Testполучает доступ к компонентам с помощью методаIWindsorContainer.Resolve<T>и проверяет их поведение - Функция
TearDown()предоставляет контейнер Windsor (и любые созданные компоненты)
Например, у меня может быть 15 тестов, которые обращаются к компонентам, которые косвенно приводят к созданию компонента IMediaPlayerProxyFactory. Функция SetUp регистрирует достаточно хорошую реализацию IMediaPlayerProxyFactory, поэтому у меня нет бремени обслуживания регистрации в каждом из 15 тестов.
Однако теперь я пишу тест Test_MediaPlayerProxyFactoryThrowsException, подтверждающий, что моя система элегантно обрабатывает ошибку из компонента IMediaPlayerProxyFactory. В методе тестирования я создал свою специальную макетную реализацию, и теперь я хочу ввести ее в рамки:
this.WindsorContainer.Register(
Component.For<IMediaPlayerProxyFactory>()
.Instance(mockMediaPlayerProxyFactory)
);
Но Windsor выбрасывает Castle.MicroKernel.ComponentRegistrationException, с сообщением "Уже есть компонент с этим именем".
Есть ли способ сделать мой mockMediaPlayerProxyFactory экземпляром по умолчанию для IMediaPlayerProxyFactory, отбрасывая уже зарегистрированный компонент?
Согласно документации , Castle Windsor 3 позволяет переопределять регистрацию, но я могу найти только один пример:
Container.Register(
Classes.FromThisAssembly()
.BasedOn<IEmptyService>()
.WithService.Base()
.ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
ConfigureFor - метод класса BasedOnDescriptor. В моем случае я не использую FromDescriptor или BasedOnDescriptor.