Я пытаюсь использовать 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
.