-- Xurxo Fresco @xurxof
--
Has recibido este mensaje porque estás suscrito al grupo "TDDev" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a tddev-sp+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a tdde...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/tddev-sp?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
--
--
Como recomendacion general, no hagas mock de clases que no sean tuyas. Crea alguna abstraccion que tenga sentido en tu dominio y mockea esta abstraccion.
Luego puedes hacer test de integracion de la implementación de esta abstraccion o bien puedes hacer tests de integracion de grano mas grueso que funcionen contra ficheros reales, o puedes hacer las dos cosas al mismo tiempo, lo que te de mejores resultados.
Todavía me acuerdo cuando empezando con tdd mockeaba JDBC jeje, en aquel momento me parecía una idea estupenda... deberíamos fundar el club de "yo hize mocks del acceso a datos (o a ficheros)"
Con respecto a los ficheros, depende del caso, pero en general voy y trabajo con ficheros.
Pero, pregunta, cual es el caso de uso para tus ficheros? Tal vez teniendo mas contexto, tendria otras opciones para sugerir.
-- Xurxo Fresco @xurxof
Hola a todos.
Se me ocurren dos alternativas:
1) Si pruebas una funcionalidad que se apoya en grabar un fichero, es interesante buscar la manera de que no grabe el fichero real, por ejemplo pasándole algún fake (no mock) que guarde el contenido en un String o un stream y luego puedas verificar.
2) Si pruebas una funcionalidad cuyo objetivo es grabar un fichero, lo más lógico es verificar si el fichero se ha creado. Esto es sencillo de hacer, por ejemplo, creando un assert que comprueba si el fichero existe o no.
Si el segundo punto enlentece mucho las pruebas, puedes poner estas pruebas en un paquete a parta (o utilizar funcionalidad experimental de JUnit para etiquetarlas en otro conjunto) y ejecutarlas menos a menudo que las otras.
En cualquier caso, más importante que la rapidez es probar lo que la funcionalidad verdaderamente debe hacer. Ten en cuenta que aunque verifiques la llamada correctamente, eso no significa que, a la hora de la verdad, el fichero se cree adecuadamente.
Un saludo.
-- Xurxo Fresco @xurxof
Hola,
Wrapper y abstraccion en este caso son lo mismo para mi. Wrapper es para encapsular y poder usar dobles :-)
Gracias de nuevo por vuestros comentarios.[Test]public void Construct_IfFileNotExists_CreateNewDefaultValues() {
// arrangevar DefaultConfigStrings = new[] {"imapUser:pepe...@gmail.com", "imapPass:password", "imapHost:imap.gmail.com", "imapPort:993", "imapUseSSL:true", @"savePath:c:\mails\", "fromFilter:u...@blabla.com", "fromFilter:d...@blabla.com", "fromFilter:tr...@blabla.com"};var FileMock = new Mock<IFileWrap>();FileMock.Setup(f => f.Exists(@"c:\newslettersaver.cfg")).Returns(false);FileMock.Setup(f => f.WriteAllLines(@"c:\newslettersaver.cfg", DefaultConfigStrings));// actionConfig Cfg = new Config(@"c:\newslettersaver.cfg", FileMock.Object);// assert WriteAllLines callFile.Verify(f => f.WriteAllLines(@"c:\newslettersaver.cfg", DefaultConfigStrings), Times.Once());
Assert.AreEqual("password", Cfg.ImapPass);
No veo cual es el sentido de crear un Wrapper que simplemente tenga los metodos que la propia clase File, no estas ganando gran cosa con este enfoque y tendras que tener una clase cuya única función es delegar en los métodos de File sin aportar nada más.En este caso tu abstracción es Config, le podemos buscar un mejor nombre, en vista del test algo como ImapConfiguration estaría bien. Esta clase ImapConfiguration yo la probaría con ficheros reales y luego las clases que necesiten esta configuración simplemente reciben una instancia de ImapConfiguration en el constructor (Inversión de dependencias). Con esto puedes hacer test unitarios de cualquier otra clase que dependa de esta configuración sin problema, y la configuración en si que lo único que hace es leer de un fichero unos datos tiene en mi opinión muy poco sentido testearla sin ficheros reales.Por otro lado, esta configuración es un value object (inmutable), en los test de las clases que usen esta configuración puedes simplemente instanciar una configuración con los valores que necesites, ni siquiera necesitas mockearla.Otra cosa, tampoco le pasaría en el constructor un path de fichero, este conocimiento que lo tenga internamente la clase ImapConfiguration (puede ser una constante, puede ser una variable de entorno) de esta manera tienes una abstracción que te da la configuración de Imap y listo, y será esa clase la que conozca los detalles de donde esta esa configuración, de si es un fichero, de si los datos del fichero se pueden sobreescribir por variables de entorno etc,etc.
--
Has recibido este mensaje porque estás suscrito al grupo "TDDev" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a tddev-sp+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a tdde...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/tddev-sp?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
-- Xurxo Fresco @xurxof
--
Has recibido este mensaje porque estás suscrito al grupo "TDDev" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a tddev-sp+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a tdde...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/tddev-sp?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
-- Xurxo Fresco @xurxof