Estoy escribiendo un componente que, dado un archivo ZIP, necesita:
- Descomprime el archivo.
- Encuentra una dll específica entre los archivos descomprimidos.
- Cargue ese dll a través de la reflexión e invoque un método sobre él.
Me gustaría probar unitariamente este componente.
Estoy tentado a escribir código que trate directamente con el sistema de archivos:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Pero la gente suele decir: "No escriba pruebas unitarias que dependan del sistema de archivos, base de datos, red, etc."
Si tuviera que escribir esto de una manera amigable para las pruebas unitarias, supongo que se vería así:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
¡Hurra! Ahora es comprobable; Puedo alimentar en dobles de prueba (simulacros) al método DoIt. ¿Pero a qué precio? Ahora he tenido que definir 3 nuevas interfaces solo para hacer que esto sea comprobable. ¿Y qué estoy probando exactamente? Estoy probando que mi función DoIt interactúa correctamente con sus dependencias. No prueba que el archivo zip se haya descomprimido correctamente, etc.
Ya no parece que esté probando la funcionalidad. Parece que solo estoy probando las interacciones de clase.
Mi pregunta es la siguiente : ¿cuál es la forma correcta de probar la unidad algo que depende del sistema de archivos?
editar Estoy usando .NET, pero el concepto podría aplicar Java o código nativo también.
myDll.InvokeSomeSpecialMethod();
donde verificaría que funciona correctamente tanto en situaciones de éxito como de fracaso, por lo que no haría una prueba unitaria, DoIt
pero DllRunner.Run
dicho mal uso de una prueba UNIT para verificar que todo el proceso funcione un mal uso aceptable y, como sería una prueba de integración enmascarando una prueba unitaria, las reglas normales de la prueba unitaria no necesitan aplicarse estrictamente