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