5

Actualmente estoy utilizando la versión 2.1 de Castle Windsor como mi contenedor y me gustaría realizar pruebas de integración utilizando los servicios registrados con ella.Pruebas de integración NUnit e inyección de dependencia

Actualmente, hago esto mi utilizando el Common Service Locator para recuperar mi instancia de servicio y realizar mis pruebas de integración en contra de ella como tal:

var myService = ServiceLocator.Current.GetInstance<IMyService>(); 
// do stuff with myService 

Lo que había idealmente gusta hacer es tener mis dependencias de servicio inyectan en mi accesorio de prueba NUnit automáticamente. Spring parece ofrecer this functionality, pero no puedo encontrar nada similar usando Castle.

¿Alguien puede indicarme la dirección correcta?

Editar:

Estoy seguro de que todo el mundo tiene puntos (válidos) sobre si es o no es una buena idea; supongamos que está en este escenario ... ¿Alguien puede decirme cómo se pudo lograr usando Windsor?

+0

se requieren sus servicios para las pruebas unitarias? ¿Has intentado utilizar un marco simulado como Moq, RhinoMocks o NMock? si realmente está probando la * integración * entre un componente y un servicio, simplemente cree tantos archivos de configuración de Castle como sea necesario y cárguelos con XmlConfigurator en su contenedor de Castle simple o personalizado –

+2

@johnny g: estoy realizando pruebas de INTEGRACIÓN; lo que significa que no quiero hacer uso de simulacros, sino de los servicios reales junto con todas sus dependencias reales.Utilizo burlas en mis accesorios de prueba de la unidad como sugirió. – DanP

+0

eep! eso es embarazoso: lee NUnit y de repente "viste" la unidad de prueba en todas partes, cuando claramente eres bastante explícito sobre la integración :) –

Respuesta

5

Si vienes a Windsor desde Spring/Spring.net, verás que hay una cantidad de cosas en las que estos proyectos no están de acuerdo. Este es uno de ellos. Como defensor de Windsor, nunca utilizaría algo como Spring's AbstractDependencyInjectionSpringContextTests. Inyectar cosas en una prueba simplemente parece estar mal, pero de nuevo, como dije, soy parcial.

Si usted quiere hacer una prueba de integración, basta con crear una nueva instancia del contenedor, añada cualquier componentes que necesita, y correr todo lo que desea probar, por ejemplo:

[Test] 
public void TestComponentThatDependsOnA() { 
    var container = new WindsorContainer(); 
    container.Register(Component.For<MyComponentA>()); 
    container.Register(Component.For<ComponentThatDependsOnA>()); 
    var a = container.Resolve<ComponentThatDependsOnA>(); 
    var result = a.DoSomething(); 
    Assert.AreEqual("ok", result); 
} 

Si ha registros cuidadosamente envuelto en installers (como debería) puede reutilizarlos en sus pruebas, haciendo las pruebas más concisas.

Si tiene configuración de XML, puede cargarla fácilmente con Configuration.FromXmlFile().

Además, no es necesario utilizar el Localizador de servicios comunes aquí.

También es útil para algunas pruebas de integración un auto-mocking container, que automáticamente se burlará de los servicios (a menos que los anule con los concretos, por supuesto).

+1

Gracias por los comentarios; Estoy usando un instalador para conectar todas mis dependencias cuando el dispositivo de prueba de integración se carga como sugirió. De hecho, realizo todo esto en un ensamblaje separado, por lo que la prueba de integración realmente no tiene idea de que Windsor está gestionando todo esto (por lo tanto, la razón para usar el localizador de servicios comunes para recuperar mis dependencias). Supongo que podría argumentarse que estoy siendo flojo con este enfoque, pero mi gráfico de dependencia es bastante complicado, así que esta es la única manera factible en que podría pensar para eliminar una tonelada de trabajo de configuración para mi accesorio de prueba de integración. – DanP

+0

Como referencia, estoy usando algo en esta línea para conectar mis dependencias: http://fabiomaulo.blogspot.com/2009/11/guywire.html – DanP

0

Creo que puedes hacer esto con Castle también. Windsor Installer es una interfaz genérica que se puede utilizar para inicializar los componentes de contenedor/registro. A continuación, puede implementar esta interfaz tantas veces como lo necesite dependiendo del contexto en el que se ejecuta la aplicación Puede tener un instalador que inyecte objetos reales en un contexto de producción y otro instalador que inyecte objetos simulados/doble prueba para las pruebas de integración .

Puede encontrar más información en http://docs.castleproject.org/Windsor.Installers.ashx

Cuestiones relacionadas