2010-02-07 27 views
9

Estoy usando StructureMap en un proyecto web para DI IOC. Funciona perfecto, pero no tengo ni idea de cómo escribir pruebas unitarias con StructureMap.Usando StructureMap con pruebas unitarias

¿Debo hacer esto en AssemblyInitialize iniciar la Configuración de StructureMap como en global.asax excepción de DataContext no utilizar LinqToSqlDataContext en vivo, pero algunos datos de la memoria de esta manera:

[AssemblyInitialize] 
public static void Start() 
{ 
     ObjectFactory.Configure(x => 
       { 
        x.For<IDataContext>().HttpContextScoped().Use<MemoryDataContext>() 
         .Ctor<string>("connectionString") 
         .Is(ConfigurationManager.ConnectionStrings["DEVConnection"].ConnectionString); 
        x.For<IDepartamentRepository>().Use<DepartamentDB>(); 
        x.For<IDevelopmentProcess>().Use<DevelopmentProcesses>().OnCreation(c => c.User = Current.CurrentUser); 
        x.For<IActivityProcess>().Use<ActivitiesProcess>().OnCreation(c=> c.User = Current.CurrentUser); 
        x.For<IDevDeveloperRepository>().Use<DevDeveloperDB>(); 
        x.For<IDevelopmentRepository>().Use<DevelopmentDB>(); 
        x.For<IActivityRepository>().Use<ActivityDB>(); 
        x.For<IActivityTypeRepository>().Use<ActivityTypeDB>(); 
        x.For<IDevUserRepository>().Use<DevUsersDB>(); 
        x.For<IAttachmentRepository>().Use<AttachmentDB>(); 
       } 
      ); 
} 

y luego usar ObjectFactory.GetInstance() prueba o como hago esto?

Respuesta

21

No debe necesitar use a DI Container in unit tests en absoluto.

Un contenedor es algo que se usa para conectar componentes juntos, pero una prueba unitaria es una prueba de cada componente aisladamente.

+0

estoy de acuerdo con eso, pero lo que si tengo una clase que consume varias instancias, general, sin swap usando DI es digamos DAL para usar en el repositorio de memoria. Si mi constructor toma 10 interfaces, entonces necesito proporcionar 10 instancias manualmente mientras uso DI, todo hecho automáticamente. Incluso si creara una composición de 10 interfaces en una, todavía necesito burlarla de alguna manera ... –

+0

@PawelCioch Si su constructor toma diez dependencias, es [probablemente haciendo demasiado] (http://stackoverflow.com/a/2420245/126014). No solo es un olor de diseño, también es probable que sea difícil de probar, o al menos de mantener las pruebas. –

+0

Creo que tengo que cambiar el trabajo para trabajar con proyectos más simples :). La clase que toma todo eso es el Servicio final para la aplicación de consola que necesita todo tipo de repositorios y filtros. Probablemente podría volver a factorizarse, pero los algoritmos están tan interconectados que es difícil aislar la unidad de trabajo. De todos modos, gracias por los comentarios. –

5

Estoy de acuerdo con Mark. La capacidad de prueba es, en primer lugar, una de las razones principales por las que es probable que utilice un contenedor.

Hay momentos en los que puede ser una buena idea crear una prueba de integración para la configuración de su contenedor. Por ejemplo, si tiene algún comportamiento en la configuración de su contenedor, querrá crear pruebas para ese comportamiento. En la configuración de contenedor usted establece IDataContext 's cadena de conexión a través del administrador de configuración.

El siguiente código es similar a lo que hago para probar una configuración de este tipo. Note que evitar ObjectFactory (objetos únicos estáticas tienen sus propios problemas) y envuelvo mi programa de instalación de contenedores en una clase de programa previo ayudante:

[Test] 
public void connection_string_should_come_from_application_configuration() 
{ 
    var container = new ContainerBootstraper().Container; 

    var connectionString = container.GetInstance<IDataContext>().ConnectionString 

    connectionString.ShouldEqual("test project application configuration connection string"); 
} 
+0

¿Sería una mala idea apuntar la comparación 'ShouldEqual' directamente al valor de AppSettings en cuestión en este caso? No voy a pretender tener una pista cuando se trata de las mejores prácticas de pruebas unitarias, pero mientras lo leía, seguí pensando que no parecía estar confirmando que provenía de la configuración. – patridge

+0

Lo siento, mi ejemplo fue muy escueto. Asumía que la configuración de la prueba habría dado el contexto necesario. La configuración sería responsable de asegurarse de que la configuración de la aplicación estuviera presente. – KevM

+0

¿Existe la posibilidad de que publiques una muestra de lo que estás haciendo con esa clase de Bootstrapper? Estoy luchando a través de algunos de los mismos desafíos, y no soy lo suficientemente brillante como para unir esto. –