2009-07-07 7 views
5

Como muchos de ustedes saben, el espacio de nombres System.IO está diseñado abismalmente. Me gustaría una biblioteca gratuita que ajuste la funcionalidad IO del archivo de una manera sensata (léase: no requiere que pase cadenas por todos lados). Recuerdo haber leído hace algún tiempo que hay un puñado de estas bibliotecas ya escritas (y el autor se sorprendió de que no hubiera más). Creo que fue uno de los chicos en devlicious o codebetter o Los Techies que hizo uno de ellos.Una buena biblioteca de IO de archivos .NET compatible con TDD

¿Alguien sabe de lo que estoy hablando u otro buen contenedor de archivos IO?

Edit: Supongo que debo especificar que realizo el Test Driven Development y mis preocupaciones son en gran parte (pero no del todo) sobre la facilidad de las pruebas de System.IO.

+0

Me gustaría escuchar su justificación para afirmar que el espacio de nombres System.IO está "mal diseñado". Personalmente, he encontrado que está muy bien diseñado, al igual que la mayoría de los BCL. – Noldorin

+2

Es solo un montón de métodos en clases estáticas, apenas OO-y. Es casi imposible e a clases de pruebas unitarias que procesan archivos sin escribir envoltorios para su funcionalidad. Apenas una interfaz en el sitio. –

+0

FileInfo no es una clase estática. –

Respuesta

3

¿Qué pasa con System.IO.FileInfo?


Tenía curiosidad, así que comencé a crear un conjunto de envoltorios usando ReSharper. Me tomó 16 minutos, y no lo he probado, y no sé si satisface tus necesidades. Aún así, pensé que describen el proceso utilicé:

  1. Crear un nuevo proyecto de biblioteca de clases
  2. Hacer Clase1 pública y cambiarle el nombre a ser FileSystemInfoWrapper
  3. darle un _fsi ámbito privado de tipo FileSystemInfo (resuelva la clase para obtener el espacio de nombre importado)
  4. Haga clic en el campo y elija Inicializar en el Constructor
  5. Haga clic en el campo nuevamente y use ReSharper -> Código -> Generar (Alt + Ins); Elija Generar delegar miembros; Haga clic en "Público" para todos los miembros públicos
  6. Lo mismo para FileInfo, sino también derivar de FileSystemInfoWrapper y remover a los miembros duplicados (ReSharper podría haber hecho mejor aquí)
  7. Lo mismo para DirectoryInfo, sino también derivar de FileSystemInfoWrapper y corregir los duplicados
  8. Para cada uno de los contenedores, haga clic en la clase y luego use ReSharper-> Refactorizar-> Extraer interfaz
  9. Tenga IFileInfoWrapper e IDirectoryInfoWrapper derivados de IFileSystemInfoWrapper, y elimine los duplicados.

El resultado son interfaces que incluyen los métodos y propiedades de las clases correspondientes, y clases concretas que delegan a las clases originales e implementan las interfaces. Debería poder crear sus propias clases simuladas y cambiar su código para usar las interfaces en lugar de usar directamente las clases concretas System.IO.

+0

Supongamos que tengo una clase que hace algo con todos los archivos en un directorio. ¿Cómo pruebo esto? Puedo pasar un objeto DirectoryInfo pero ¿cómo me burlo? ¿Cómo resuelvo la lista de objetos FileInfo que proporcionará? ¿Cómo me aseguraré de que la prueba no interactúe con el sistema de archivos? –

+1

Definitivamente, puedo crear mis propios contenedores, pero sé que la gente ya hizo ese trabajo, lo optimizó, encontró los errores, etc. Esa fue mi pregunta. –

+0

@George: ¿Su código hace algo en el directorio o en todos los ARCHIVOS? En ese caso, ¿no tendría más sentido, desde una perspectiva de escalabilidad y reutilización, pasar una matriz de FileInfo o cadenas, en lugar de un directorio en particular? –

2

Tengo curiosidad por saber qué tiene de abismal el diseño del espacio de nombres System.IO. Por supuesto, elegir una interfaz o clase en particular puede ser algo así como un ejercicio arbitrario, pero no estoy familiarizado con el problema de tener que pasar cadenas por todos lados.

¿Tal vez podría dar más información acerca de su problema en particular?


EDITAR

Usted parece indicar que desea que las clases que se basan en el espacio de nombres System.IO que permitirá poner a prueba sin escribir en el sistema de archivos. No veo cómo puede probar adecuadamente una función que escribe en el sistema de archivos sin ella, bueno, escribiendo en el sistema de archivos. Si desea probar su lógica desde una perspectiva de escritura, entonces permita que las funciones tomen System.IO.Stream o System.IO.TextWriter, la que sea más apropiada. Esto le permitirá probar los diversos componentes de su código sin necesariamente tener un impacto externo; solo pase un System.IO.MemoryStream en lugar de un System.IO.FileStream. Obviamente, no se encontrará con problemas como quedarse sin espacio, acceso denegado, etc., pero nunca podrá enfrentar esos errores sin ejecutar en vivo contra el sistema de archivos. Es por eso que puede exponer las funciones externas que toman System.IO.FileInfo o una ruta de cadena (o una matriz/IEnumerable<> de cualquiera, lo que sea que necesite) que pueden proporcionar otro nivel de prueba en vivo.

El espacio de nombres System.IO está bastante bien poblado, y nunca he encontrado un enfoque particularmente no OO.

+0

Me gusta hacer TDD. Lo que significa que necesito algo un poco más que clases y métodos estáticos. Pero en cuanto a pasar cadenas, considere Directory.GetFiles() que toma un directorio como una cadena y devuelve archivos como una matriz de cadenas. Para más información, responda o John –

+0

¿Por qué no DirectoryInfo y FileInfo?Esos son ambos tipos que traen un paradigma OO a la gestión de archivos. En algún momento, tendrá que lidiar con cadenas cuando está hablando de rutas. Realmente no veo ninguna ventaja en la biblioteca de NDepends a la que vinculó. ¿Me estoy perdiendo lo que estás buscando? –

3

Creo que está buscando this question y this blog post. Sin embargo, solo envolví System.IO.File y System.IO.Directory. Sin FileInfo u otras cosas.

+0

Gracias mauricio. Eso no es exactamente lo que estaba buscando (me refiero a que no es el artículo exacto) pero podría terminar utilizándolo en lugar de tratar de buscar código para encontrarlo. –

2

Ok, fui a cavar. This es el artículo al que me refería.

Y this es la API (generado a partir del proyecto NDepend

0

Hay un conjunto bastante completo de adaptadores proporcionados en http://systemwrapper.codeplex.com. Encontrará más o menos todos System.IO está envuelto, junto con un buen número de otros Los espacios de nombres del sistema (envolver la clase DateTime siempre es una buena jugada si está trabajando con cálculos sensibles al tiempo)

Cuestiones relacionadas