2011-04-29 11 views
7

Tengo problemas para usar Moq en un proyecto UnitTesting con Ninject.Burlando de un objeto con Moq, usando Ninject al hacer UnitTesting

Primero algunas líneas sobre mi solución. Contiene varios proyectos (BussinesLogic, DAL, Infraestructura ...). Mi objetivo es UnitTest la lógica que estoy usando en el proyecto BussinessLogic. La solución es básica para un servicio de Windows, pero he incluido la lógica para que pueda ejecutarse de manera independiente. Estoy usando Ninject y especifico el clima que quiero usar ProductionModule o TestingModule (el servicio de Windows usa ProductionModule, la aplicación de consola usa TestingModule)

Estoy usando un patrón de fábrica para obtener kernel ninject cada vez que lo necesito dentro de mi solicitud.

Mi TestingModule hereda de NinjectModule donde anulo el método Load() y allí hago el enlace. Por ejemplo:

Bind<IStorageManager>().To<StubStorageManager>();

tengo el StubStorageManager pero es vacío. Contiene solo la declaración de métodos de IStorageManager.

Lo que me gustaría hacer es (en términos simples): Crear un UnitTest donde crearía un nuevo kernel especificando el TestingModule como su parámetro. Entonces me gustaría crear un objeto simulado (digamos un simulacro de IStorageManager) storageManagerMock. Algún método en IStorageManager devuelve un messageObject así que probablemente necesite burlarse de eso también, porque la lógica de negocios está haciendo algo basado en ese messageObject. Así que me gustaría establecer de alguna manera las propiedades de ese objeto de mensaje y luego llamar a algún método de BusinessLogic, así puedo ver si la lógica funciona correctamente.

Espero no haberlo complicado demasiado.

Ten paciencia conmigo, soy completamente nuevo en la inyección de burla y dependencia, pero estoy dispuesto a aprender.

+0

Posible duplicado: http://stackoverflow.com/questions/1465849/using-ioc-for-unit-testing –

Respuesta

12

Dudo que realmente quieras usar Ninject en tus pruebas. El objetivo de usar ninject es que puedes desacoplar todo. También, si es posible, intente mantener todo desacoplado del contenedor de dependencia. Pásalo si es necesario, o pasa en las fábricas que crean el objeto requerido y haz que el contenedor pase en la fábrica.

sospecho que es probable que desee hacer algo como esto:

public void ATest(){ 
    //create a mock StorageManager 
    var managerMock = new Mock<IStorageManager>(); 
    //create a mock MessageObject to be used by business logic 
    var messageObjectMock = new Mock<MessageObject>(); 

    //have the storage manager return the mock message when required 
    managerMock.Setup(x => x.GetMessageObject()).Returns(messageObjectMock.Object); 
    //set up message expectations 
    messageObjectMock.Setup(x => x.ThisValueExpected).Returns(10); 
    messageObjectMock.Setup(x => x.ThisFunctionShouldBeCalled()).Verifiable("Function not called."); 

    //thing to test 
    BusinessLogicObject blo = new BusinessLogicObject(managerMock.Object); 
    blo.DoTheThingImTesting(); 

    //make sure the business logic called the expected function, or do whatever check you need... 
    messageObjectMock.Verify(); 
} 
+3

Esto es exactamente lo yo queria hacer. Ok, entonces usar un contenedor DI en la prueba es malo, ¿lo tomo? ¿Por qué es así? Pensé que al usarlo, podría simplificar mis pruebas, así que no tengo que escribir: 'var p = new Program (nuevo StubHealthMonitor(), storageManagerMock, nuevo LogManager(), nuevo StubConfigurationManager()); 'Básicamente pensé que Dejaría que el contenedor DI se encargue de todas las cosas que no involucran directamente esta prueba, pero lo único que sí implica la prueba, podría especificarlo solo a través de Moq. –

+5

No estoy seguro de haber llegado tan lejos como para decir que usar DI en las pruebas es "malo". Sub-óptimo tal vez;) Lo que desea hacer con sus pruebas es eliminar tantas "cosas" externas como sea posible y solo usar lo que está probando. Si usa DI en sus pruebas, ahora tiene la complejidad adicional de su inyección de dependencia. En ese punto, de hecho estás probando tu DI y lo que está bajo prueba. Es posible que pueda justificar el uso de DI en sus pruebas, aunque nunca lo haya necesitado todavía. Cuando se usa DI, nada debe estar estrechamente acoplado a nada, incluida la DI, por lo que no debería necesitarlo. –

Cuestiones relacionadas