2010-11-28 8 views
5

Estoy tratando de convertir parte de nuestro código de creación complejo para usar un contenedor IoC, Autofac, y porque soy un gran creyente en TDD, estoy escribiendo pruebas unitarias para la configuración del Módulo.¿Cómo probar esta unidad de registro de IoC utilizando componentes con nombre? (Autofac)

La mayor parte de la funcionalidad es muy fácil de probar, p.

var obj = container.Resolve<IThing>(); 
Assert.IsInstanceOfType(obj, typeof(ThingImplementer)); 

pero tenemos una serie de casos en los que tenemos múltiples ejecutores de la misma interfaz y distintos actores están siendo pasados ​​a diferentes clases concretas. Lo resolví mediante el uso de un registro con nombre, p.

builder.RegisterType<ThingImplementer>().Named<IThing>("Implementer1"); 
builder.RegisterType<OtherImplementer>().Named<IThing>("Implementer2"); 
builder.Register(c => new Foo(c.ResolveNamed<IThing>("Implementer1"))).As<IFoo>(); 

Lo que no puedo entender es una manera fácil de escribir una prueba unitaria de asegurar que se pone Foo ThingImplementer y no OtherImplementer. Me pregunto si vale la pena el esfuerzo, tenemos pruebas de integración de alto nivel que lo cubren, pero no proporcionan la documentación ni los beneficios de refactorización que ofrecen las pruebas unitarias.

¿Escribirías una prueba unitaria para esto? Si es así, ¿cómo?

Respuesta

7

Normalmente no probará la configuración de su contenedor en las pruebas de su unidad. En su entorno de prueba unitaria no utiliza un contenedor para inyectar dependencias (lo hace a mano) y si lo hiciera, inyectaría objetos falsos, y no los tipos de producción real. Por lo tanto, la configuración del contenedor generalmente es desconocida para las pruebas de su unidad.

Lo que suelo hacer a veces es comprobar si el contenedor puede crear los tipos de raíz de la aplicación (como las clases de controlador de una aplicación MVC o las clases de página de una aplicación WebForms). Como el contenedor instanciará un gráfico de objetos, me dará una buena idea de si el contenedor está configurado correctamente. Sin embargo, nunca me interesa si el contenedor devuelve la implementación correcta. La mayoría de las veces solo hay una implementación de una interfaz registrada accesible para la raíz de la aplicación, por lo que difícilmente podría salir mal.

Si desea probar la configuración de su contenedor, quizás sea demasiado complejo y debe intentar simplificar el diseño de su aplicación para que pueda simplificar el registro.

2

Nada nuevo aquí, solo extensiones de los puntos de Steven.

Como dice Steven, definitivamente no es una prueba unitaria. Quizás puedas verlo como una prueba de aprendizaje. Eche un vistazo al conjunto de pruebas Ninject, que muestra cómo hacen esas pruebas (pero recuerde que están escribiendo un contenedor). Supongo que autofac tiene pruebas similares.

Habiendo dicho eso, si sientes que hay un comportamiento interesante y no se volverá escamoso, no es dañino incluirlo en un paquete de integración.

El otro punto en relación con el hecho de que es externa es también muy válida - ver la noción de un Onion Architecture

Cuestiones relacionadas