Я пытаюсь использовать 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)
);
Но Виндзор выдает 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
.