2012-09-18 19 views
7

Tengo un grupo de clases que implementan una interfaz y uno de los parámetros es un StreamWriter.C# Unit Prueba un parámetro StreamWriter

Necesito comprobar el contenido de StreamWriter.

Estoy tratando de encontrar la manera de evitar escribir archivos de texto en el servidor de prueba y abrirlos para verificar los contenidos.

¿Existe alguna forma de convertir rápidamente el contenido/flujo de StreamWriter a una variable StringBuilder?

Respuesta

11

No puede comprobar el StreamWriter. Puede verificar la transmisión subyacente a la que está escribiendo. Por lo tanto, podría usar un MemoryStream en su prueba de unidad e indicarle StreamWriter. Una vez que ha terminado de escribir, puede leer de él.

[TestMethod] 
public void SomeMethod_Should_Write_Some_Expected_Output() 
{ 
    // arrange 
    using (var stream = new MemoryStream()) 
    using (var writer = new StreamWriter(stream)) 
    { 
     // act 
     sut.SomeMethod(writer); 

     // assert 
     string actual = Encoding.UTF8.GetString(stream.ToArray()); 
     Assert.AreEqual("some expected output", actual); 
    } 
} 
+1

'StreamWriter' utiliza UTF-8 por defecto, así que eso es lo que debería ser utilizado para obtener' actual'. –

+0

Buen punto @Jon, como siempre. –

+0

Esto funcionó, gracias. Lo único diferente es que declare la var de cadena real fuera del uso, y la probé fuera del uso también. –

9

Yo sugeriría que cambie el parámetro a TextWriter si es posible - y en ese momento se puede utilizar un StringWriter.

Como alternativa, puede crear un StreamWriter alrededor de un MemoryStream, a continuación, comprobar el contenido de ese MemoryStream más tarde (ya sea por el rebobinado, o simplemente llamando ToArray() para obtener el contenido completo como una matriz de bytes. Si realmente quiere ser la prueba texto sin embargo, es definitivamente más fácil de usar un StringWriter.

+0

Tal vez pueda cambiarlo, pero la interfaz está siendo utilizada por varias otras clases. –

+3

@ user295734: Cualquier cosa que esté * usando * todavía podrá pasar en un 'StreamWriter' - pero si realmente solo quieres algo en lo que puedas escribir texto, 'TextWriter' es casi seguro una mejor abstracción para usar. Solo debe cambiar las * implementaciones * de la interfaz ... y espero que estén bien. –

+0

Si estuviera comenzando de cero, probablemente volvería a hacer los cambios, hay mucho que cambiar de código de otras personas y tal, que no tengo tiempo para probar todo su código (supongo que deberían haber escrito pruebas de unidad para su código.) Gracias por el aviso para la próxima vez. –

2

puede sustituirlo por un StreamWriter que escribe en un MemoryStream.

1

En ese caso necesita para burlarse del caso de prueba. puede utilizar marcos gustos rinoceronte se burla. Esa ventaja del marco burlón es decir, puede verificar el contenido de los objetos, pero no es necesario que acceda al servidor u ocupe los recursos del servidor.

Este enlace le proporcionará los ejemplos básicos: http://www.codeproject.com/Articles/10719/Introducing-Rhino-Mocks

+2

¿Por qué crees que se requiere burla en este caso? La burla ayudaría si el OP quisiera probar cómo se comportó su código en casos de error, pero para descubrir lo que se está escribiendo, no hay necesidad de usar el burlarse. –

+1

Estamos utilizando Moq en nuestras pruebas unitarias. –