2009-08-17 16 views
8

Soy un novato en pruebas unitarias. ¿Cómo verifico el resultado de la consola? tengoAyuda de prueba unitaria. ¿Cómo pruebo la salida de un mensaje a la consola?

namespace XXShapes 
{ 
    public abstract class XXShape 
    { 
     public virtual void DrawXXShape() 
     { 
      Console.WriteLine("The XXShape was drawn."); 

     } 
    } 

public class XXCircle : XXShape 
{ 
    public override void DrawXXShape() 
    { 
     Console.WriteLine("The XXCircle was drawn."); 
    } 
} 

}

namespace XXShapes.Test 
{ 
    [TestFixture] 
    public class XXShapeTest 
    { 
     [Test] 
     public void MyFirstTest() 
     { 
      XXShape s = new XXCircle(); 
      string expected = "The XXCircle was drawn."; 
      s.DrawXXShape(); 
      string actual = Console.ReadLine(); 
      Assert.AreEqual(expected, actual); 
     } 
    } 


} 

¿Cómo debería ser correctamente probando esto? Gracias por cualquier punteros. Cheers, ~ ck

Respuesta

0

Eso no es para nada lo que harías.

En la prueba que normalmente se compruebe el estado del objeto, con algo como:

Assert.IsTrue(foo.Field, Equals, "hello") 

Dependiendo de cómo funciona su marco elegido. Por lo tanto, deberá cambiar su enfoque, en general, para ajustarse a este modelo.

4

No necesita probar la rutina 'Console.WriteLine' porque debe asumir que funciona, no es su código, entonces, ¿por qué quiere probarlo? Es necesario para probar si usted produce cadena correcta que se pasa a 'Console.WriteLine'

En otras palabras, en lugar de:

public override void DrawXXShape() 
{ 
    Console.WriteLine("The XXCircle was drawn."); 
} 

que podría hacer:

public override void DrawXXShape() 
{ 
    Console.WriteLine(produceXxCircle()); 
} 

public string produceXxCircle() 
{ 
    return "The XXCircle was drawn."; 
} 

y luego en el caso de prueba:

Assert.AreEqual(produceXxCircle(), "The XXCircle was drawn."); 

Espero que ayude. Regads Simon

+0

That Assert solo está probando el método produceXxCircle(), no es que se haya llamado al método draw. –

+0

De hecho, pero ¿qué quieres probar? Si Console.WriteLine está enviando cadenas correctamente a la consola? No debe probar esto, ya que Console.WriteLine no es su código. Es parte del framework –

+0

Sí, el código original tal como está dado trata de realizar una prueba bastante vacía - llamando 's.DrawXXShape();' y luego verificando que se haya llamado al método 'DrawXXShape'. Pero al menos está empezando a probar. –

14

La respuesta literal sería que utilizaría Console.SetOut antes de llamar a la clase que se está probando para dirigir stdout en un MemoryStream o similares, cuyo contenido se puede inspeccionar más tarde.

La mejor respuesta sería utilizar un marco de burla, como Rhino Mocks para crear una instancia concreta de su clase abstracta, con un conjunto de expectativas que se llamará al método DrawXXShape.

0

Supongo que algunas otras pruebas prueban las capacidades de dibujo: si ahora quiere probar que sus clases escriben algo en particular a la consola, entonces debe abstraerse la idea de escribir en la consola.

Cree una interfaz con un método WriteLine() e inyecte instancias que implementen esta interfaz en XXShapes. Sus pruebas pueden inyectar mocks o stubs que pueden capturar las cadenas que se escriben y probar su contenido en las pruebas.

Cuestiones relacionadas