P1:
Usted tiene tres opciones aquí.
Opción 1: vivir con ella.
(sin ejemplo: P)
Opción 2: Crear un ligero abstracción cuando sea necesario.
En lugar de hacer las E/S de archivo (File.ReadAllBytes o lo que sea) en el método bajo prueba, puede cambiarlo para que IO se haga afuera y pase una transmisión.
public class MyClassThatOpensFiles
{
public bool IsDataValid(string filename)
{
var filebytes = File.ReadAllBytes(filename);
DoSomethingWithFile(fileBytes);
}
}
se convertiría en
// File IO is done outside prior to this call, so in the level
// above the caller would open a file and pass in the stream
public class MyClassThatNoLongerOpensFiles
{
public bool IsDataValid(Stream stream) // or byte[]
{
DoSomethingWithStreamInstead(stream); // can be a memorystream in tests
}
}
Este enfoque es una solución de compromiso. En primer lugar, sí, es más comprobable. Sin embargo, intercambia la capacidad de prueba por una pequeña adición a la complejidad. Esto puede afectar la capacidad de mantenimiento y la cantidad de código que tiene que escribir, además de que puede mover su problema de prueba a un nivel.
Sin embargo, en mi experiencia, este es un enfoque agradable y equilibrado, ya que puede generalizar y hacer comprobable la importante lógica sin comprometerse con un sistema de archivos completamente envuelto. Es decir. puedes generalizar las partes que realmente te interesan, dejando el resto tal como está.
Opción 3: Envolver todo el sistema de archivos
Tomando un paso más allá, el imitar el sistema de archivos puede ser un enfoque válido; depende de la cantidad de hinchazón con la que estés dispuesto a vivir.
He hecho esta ruta antes; Tenía una implementación de sistema de archivos envuelto, pero al final simplemente lo eliminé.Hubo diferencias sutiles en la API, tuve que inyectarlo en todas partes y, en última instancia, fue un dolor extra con pocas ganancias ya que muchas de las clases que lo usaban no eran muy importantes para mí. Si hubiera estado usando un contenedor IoC o escribiendo algo que fuera crítico y las pruebas necesitaran ser rápidas, podría haberme quedado con él. Al igual que con todas estas opciones, su millaje puede variar.
cuanto a su pregunta contenedor IoC:
inyectarse la prueba de dobles manualmente. Si tiene que hacer un montón de trabajo repetitivo, solo use los métodos de instalación/fábrica en sus pruebas. ¡Utilizar un contenedor de IoC para realizar pruebas sería excesivo en extremo! Sin embargo, tal vez no entiendo tu segunda pregunta.
si es o no el uso de DI para las pruebas unitarias deben ser una cuestión separada IHMO. –
Recomendaría usar el período DI ** ** (ver [este artículo] (http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx), y las que enlaza) –