2011-09-22 11 views
5

Tengo el siguiente problema, quiero usar Ninject en mis pruebas unitarias. Mis pensamientos acerca de esto fueron así:Anular el enlace Ninject localmente dentro de un método de prueba para vincular objetos simulados

1) Definir un esquema de unión mundial dentro de un módulo para unir mis objetos falsos que uso el interior de las pruebas

2) Cuando se utiliza un objeto de burla se unen de forma local dentro de la prueba

No encontré la manera de anular localmente la configuración de enlace, mi idea es crear localmente un objeto simulado con expectativas y quiero que el método kernel.Get() devuelva un objeto que tenga todos los enlaces en excepto que cada prueba agrega un objeto simulado local dentro de una prueba con expectativas, esto me parece legible y mantenible, ya que solo anulo 1 enlace por prueba, los objetos son e se burla por lo que no se pueden configurar dentro del módulo ya que el contexto de prueba es desconocido

Como puedo lograr esto, estoy usando C# y nunit. Si mi metodología es incorrecta, me gustaría escuchar la correcta.

Respuesta

3

No debe usar su contenedor IoC para crear el objeto que desea probar en las pruebas de su unidad. En su lugar, créelo manualmente usando new y pase un objeto de simulacro/apéndice para cada argumento de constructor.

+1

O considere usar http://autofixture.codeplex.com –

+1

o considere usar AutoMoq - https: // github.com/darrencauthon/AutoMoq – viggity

+3

Qué sucede si lo que está probando es la validez de sus enlaces DI y necesita sobrescribir un enlace que falla a menos que esté en el entorno de la aplicación (por ejemplo, un enlace a un servicio de configuración que buscará archivos de configuración)? –

35

Tengo el mismo problema y entiendo que no es la mejor manera de hacerlo pero por mi parte, hago pruebas de integración; no pruebas unitarias

Aquí está mi solución:

Kernel.Rebind<TypeToBind>().ToConstant(Mock.Object); 

Dónde Kernel es el objeto que ha utilizado para crear la unión. TypeToBind es el tipo del que desea inyectar la dependencia. Mock.Object es el objeto que ha configurado previamente.

Una vez más, sé que no es muy bueno, pero al trabajar en código heredado donde las pruebas unitarias son difíciles de insertar, podría ser una salvación tener una buena red de seguridad.

+4

Creo que está perfectamente bien hacer algo así yo mismo todas nuestras pruebas hacen esto. De hecho, AtUnit in java fue inventado para usar puramente un marco DI para pruebas unitarias;). –

2

Creo que usar el framework IoC para pruebas es la forma perfecta de hacerlo. De hecho, es por eso que IoC existió en primer lugar y luego llegaron los marcos. Guice (framework de inyección de datos de java de Google) realmente admite esta función donde se pasa el Módulo con los enlaces de producción y luego se pasa un TestModule que puede anular ciertas vinculaciones con objetos simulados y luego se puede probar. Hemos estado haciendo esto y ha estado muy limpio durante mucho tiempo ahora en Java. Estoy entrando en mí mismo ahora mismo para tratar de que mis pruebas vuelvan a enlazar cosas pero guarde el resto de las vinculaciones ...

También hay marcos como AtUnit donde se supone que debes usar el marco DI para probar los objetos y NO use la nueva palabra clave en absoluto. (Desafortunadamente, todavía no veo un puerto de ese framework en C# land :().

NOTA: El motivo es deseable, como cuando las personas agregan un nuevo enlace en producción módulo y luego usarlo en uno de mis sistema en clases de prueba, no falla con excepciones de nullpointer porque una interfaz no estaba vinculada en la prueba. La gente sigue agregando y la prueba sigue funcionando. En mi opinión, solo debes usar el palabra clave "nueva" con dtos y tal en estos días, y toda la lógica de biz debe estar conectada con DI haciendo que sea fácil t o agregue las pruebas ahora o en un punto posterior con bastante facilidad (aunque me gustaría agregar las pruebas primero).

Cuestiones relacionadas