2012-06-22 17 views
6

Hasta ahora he creado la siguiente interfaz:¿Cómo se burla de la clase DirectoryInfo?

public interface IDirectoryInfoWrapper 
    { 
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType); 
    public IDirectoryInfoWrapper[] GetDirectories(); 
    } 

He estado yendo a través del código de sustitución DirectoryInfo con IDirectoryInfoWrapper. Todo iba bien hasta que encontré esto:

// Check that the directory is valid 
    DirectoryInfo directoryInfo = new DirectoryInfo(argPath); 
    if (directoryInfo.Exists == false) 
    { 
    throw new ArgumentException 
     ("Invalid IFileFinder.FindFiles Directory Path: " + argPath); 
    } 

No tiene sentido poner el constructor en la interfaz, por lo que debo hacer con esta línea de código:

DirectoryInfo directoryInfo = new DirectoryInfo(argPath); 
+0

interfaz, por supuesto, va sin un constructor, pero su implementación con el constructor. –

Respuesta

5

veo dos obvia opciones:

  1. DirectoryInfo Reemplazar con su propia implementación envoltorio allí (no ideal)
  2. Crear una fábrica que puede hacer IDirectoryInfoWrapper instancias. Puede hacer una función Create con sobrecargas para cada constructor que desee utilizar.

Supongo que está haciendo esto con la inyección de dependencia, lo que significa que ahora solo debe inyectar esa fábrica en cualquier clase que necesite crear nuevos objetos de información de directorio.

Además, usted quiere modificar la interfaz de contenedor para exponer que Exists propiedad

Editar: la lectura, si está haciendo esto para tratar de algo, prueba de la unidad (que parece probable), entonces usted puede ser que intente Misko Hevery. Cada vez que utiliza el operador new en C#, tiene un punto donde no puede inyectar algo en tiempo de ejecución. Esto hace que sea muy difícil probar cualquier cosa usando new en cualquiera de los casos menos triviales. Para cualquier cosa que no sea un simple objeto de datos, casi siempre uso una fábrica.

Editar II:

Estás delegando la construcción de la fábrica, así que es donde se utiliza el DirectoryInfo verdadero constructor:

class Factory : IFactory 
{ 
    IDirectoryInfoWrapper Create(string arg) 
    { 
    var dirInfo = new DirectoryInfo(arg); 
    var wrapper = new DirectoryInfoWrapper(dirInfo); 
    return wrapper; 
    } 
} 
+0

¿Por qué el # 1 no es ideal? –

+0

Aún estaría utilizando el objeto real 'DirectoryInfo', solo con una capa de indirección. Si estás escribiendo pruebas unitarias usando esta clase (que asumo), entonces ahora tienes que crear directorios para probar esto. Una prueba de unidad que interactúa con el sistema de archivos es una mala idea, pueden surgir toda clase de problemas porque realmente no se controla el sistema de archivos. –

Cuestiones relacionadas