Estoy intentando utilizar el castillo de Windsor en mis pruebas automatizadas, así:En el castillo de Windsor 3, anular un registro de componentes existentes en una unidad de prueba
En cada prueba:
- La función
Setup()
crea una recipiente Windsor, registrarse implementaciones predeterminadas de cada componente - el
Test
acceso a las funciones de los componentes mediante el método deIWindsorContainer.Resolve<T>
, y pone a prueba su comportamiento - el
TearDown()
dispone de función del contenedor de Windsor (y cualquier componentes creados)
Por ejemplo, podría haber 15 pruebas que accede a los componentes que indirectamente como resultado la creación de un componente IMediaPlayerProxyFactory
. La función SetUp
registra una implementación lo suficientemente buena IMediaPlayerProxyFactory
, por lo que no tengo la carga de mantenimiento de registrar esto en cada una de las 15 pruebas.
Sin embargo, ahora estoy escribiendo una prueba Test_MediaPlayerProxyFactoryThrowsException
, lo que confirma que mi sistema maneja elegantemente un error del componente IMediaPlayerProxyFactory
. En el método de ensayo que he creado mi aplicación simulada especial, y ahora quiero inyectarlo en el marco:
this.WindsorContainer.Register(
Component.For<IMediaPlayerProxyFactory>()
.Instance(mockMediaPlayerProxyFactory)
);
Pero Windsor lanza una Castle.MicroKernel.ComponentRegistrationException
, con el mensaje "Ya existe un componente con ese nombre. "
¿Hay alguna manera de que pueda hacer que mi mockMediaPlayerProxyFactory
sea la instancia predeterminada para el IMediaPlayerProxyFactory
, descartando el componente que ya está registrado?
De acuerdo con la documentation, el castillo de Windsor 3 permite a las anulaciones de registro, pero sólo pude encontrar un ejemplo:
Container.Register(
Classes.FromThisAssembly()
.BasedOn<IEmptyService>()
.WithService.Base()
.ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
ConfigureFor
es un método de la clase BasedOnDescriptor
. En mi caso, no estoy usando FromDescriptor
o BasedOnDescriptor
.
nombrar e invocar el método '.IsDefault' no son necesarios en la implementación real, aparte de eso, ¡muy bien! – bevacqua
Gracias por actualizar la respuesta. –