suponga una clase legado y la estructura método como el de abajoPrueba de la unidad y la inyección de dependencia con dependencias anidadas
public class Foo
{
public void Frob(int a, int b)
{
if (a == 1)
{
if (b == 1)
{
// does something
}
else
{
if (b == 2)
{
Bar bar = new Bar();
bar.Blah(a, b);
}
}
}
else
{
// does something
}
}
}
public class Bar
{
public void Blah(int a, int b)
{
if (a == 0)
{
// does something
}
else
{
if (b == 0)
{
// does something
}
else
{
Baz baz = new Baz();
baz.Save(a, b);
}
}
}
}
public class Baz
{
public void Save(int a, int b)
{
// saves data to file, database, whatever
}
}
Y entonces asumir la gestión emite un mandato nebulosa para realizar las pruebas unitarias para cada nueva cosa que hacemos, ya sea una función adicional, requisito modificado o corrección de errores.
Puedo ser un riguroso para la interpretación literal, pero creo que la frase "prueba de unidad" significa algo. Esto no significa, por ejemplo, que las entradas dadas de 1 y 2 que la prueba unitaria de Foo.Frob
deberían tener éxito solo si 1 y 2 se guardan en una base de datos. De acuerdo con lo que he leído, creo que en última instancia significa basado en entradas de 1 y 2, Frob
invocado Bar.Blah
. Si o no Bar.Blah
hizo lo que se supone que debe hacer, no es mi preocupación inmediata. Si me preocupa probar todo el proceso, creo que hay otro término para eso, ¿no? Pruebas funcionales? ¿Prueba de escenario? Lo que sea. Corrígeme si estoy siendo demasiado rígido, por favor!
Siguiendo con mi interpretación rígida, por el momento, vamos a suponer que quiero tratar de utilizar la inyección de dependencia, con uno de los beneficios es que puedo burlarse de distancia mis clases para que pueda, por ejemplo, no persistir mi datos de prueba a una base de datos o archivo o cualquiera que sea el caso. En este caso, Foo.Frob
necesita IBar
, IBar
necesita IBaz
, IBaz
puede necesitar una base de datos. ¿Dónde se inyectarán estas dependencias? En Foo
? O ¿necesita Foo
simplemente IBar
, y luego Foo
es responsable de crear una instancia de IBaz
?
Cuando entra en una estructura anidada como esta, puede ver rápidamente que puede haber varias dependencias necesarias. ¿Cuál es el método preferido o aceptado para realizar tal inyección?
+1 - para dependencias profundamente anidadas, creo que los marcos IoC/DI Container a menudo son una buena solución. Ver http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx – TrueWill