В Castle Windsor 3 переопределить существующую регистрацию компонента в модульном тесте

Я пытаюсь использовать Castle Windsor в своих автоматических тестах следующим образом:

В каждом тесте:

  • Функция Setup () создает контейнер Windsor, регистрируя значение по умолчанию реализации каждого компонента
  • Функция Test обращается к компонентам через метод IWindsorContainer.Resolve и проверяет их поведение
  • The 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 .

27
задан Liam 4 May 2016 в 11:07
поделиться