Tengo IWindsorContaner que existe para toda la vida útil de la aplicación. Para Unittest es posible registrar mocks/stubs, etc. bajo su Type. Cuando finaliza la prueba y se desecha el accesorio, los componentes registrados en la prueba se eliminan con un método creado por sí mismo llamado "Anular el registro".¿Cómo se eliminan los componentes con Castle 3.0?
Ahora, quiero actualizar a la última versión de Castle que es 3.0. De acuerdo con la versión 3.0 señala algo así como
public void Unregister(string contextName, string registrationName)
{
IWindsorContainer context = GetOrCreateContext(contextName);
context.Kernel.RemoveComponent(registrationName);
}
ya no es posible, ya que el método IKernel.RemoveComponent se ha eliminado. La descripción para corregir esto no es realmente suficiente ("Intenta utilizar IHandlerSelectors").
una versión simplificada del aparato que utilizo para unittests:
public sealed class DependencyInjectionFixture : IDisposable
{
private Stack<Type> registeredTypes = new Stack<Type>();
// Registering of mocks/stubs, etc
public void RegisterSingleton<T>(T singleton, string objectName)
{
registeredTypes.Push(typeof(T));
IWindsorContainer context = GetOrCreateContext(contextName);
context.Register(Component.For(typeof(T))
.Named(objectName)
.Instance(singleton)
.LifeStyle.Singleton);
}
// Called when tests ends
public void Dispose()
{
IWindsorContainer context = GetOrCreateContext(contextName);
while (registeredTypes.Count > 0)
context.Kernel.RemoveComponent(CSApplicationContext.GetRegistrationNameFor(registeredTypes.Pop()));
}
}
¿Cómo puedo eliminar los componentes con el castillo de 3.0?
Por supuesto, esto funcionaría. Pero esto también requeriría muchos cambios de código en muchos proyectos de software dependientes. Encontré una solución al colocar un objeto de soporte en el contenedor en lugar del real. Pero cuanto más pienso en ello, Castle realmente no parece ser el contenedor correcto de IoC para los unittest, ¿verdad? – Antineutrino
Para todas las pruebas unitarias que he escrito hasta este punto, Castle ha sido exactamente el contenedor de IoC perfecto para las pruebas unitarias. ¿Por qué necesita borrar todas las entidades registradas de todos modos? – eouw0o83hf
Porque cada prueba unitaria registra sus propios simulacros. Si no se eliminan, la próxima prueba de la unidad usaría los simulacros incorrectos. Entonces, hay un código en el método IDisposable.Dispose del dispositivo de prueba Ioc que elimina todos los componentes. – Antineutrino