2010-01-26 615 views
31

Estoy construyendo una prueba de unidad en C# con NUnit, y me gustaría probar que el programa principal en realidad da salida a la salida de la derecha en función de los argumentos de línea de comandos.Asir la salida enviada a Console.Out dentro de una prueba de unidad?

¿Hay alguna manera desde un método de prueba NUnit, que llame al Program.Main(...) para tomar todo lo escrito en Console.Out y Console.Error para que pueda verificarlo?

+1

Es una prueba de integración y no una prueba de unidad. –

+0

Acepto, estoy reelaborando el diseño de la solución para reflejar eso en este momento. –

+0

Aunque es una especie de área gris, no estoy invocando ningún programa externo, simplemente llamando código en mi archivo de programa, pero todavía creo que es más como una prueba de integración que una prueba de unidad. –

Respuesta

55

Puede redirigir la consola de entrada, salida y error para StringWriters personalizados, como este

[TestMethod] 
public void ValidateConsoleOutput() 
{ 
    using (StringWriter sw = new StringWriter()) 
    { 
     Console.SetOut(sw); 

     ConsoleUser cu = new ConsoleUser(); 
     cu.DoWork(); 

     string expected = string.Format("Ploeh{0}", Environment.NewLine); 
     Assert.AreEqual<string>(expected, sw.ToString()); 
    } 
} 

Ver this blog post para más detalles.

+0

¡Funcionó como un amuleto, gracias! –

+0

Si utiliza ReSharper que se pierda la pantalla de salida para todas las pruebas adicionales al hacer esto :( –

+0

@EgorPavlikhin: debe restablecer la salida estándar al final de cada prueba mediante el uso de 'Console.SetOut (nuevo StreamWriter (Console.OpenStandardError()) '(puede que tenga que configurar también' Autoflush' en true). Después de esto, que funcionará con cualquier corredor de prueba, incluyendo R #. – Abel

8

Puede utilizar esta clase simple para obtener la salida de una instrucción using:

public class ConsoleOutput : IDisposable 
{ 
    private StringWriter stringWriter; 
    private TextWriter originalOutput; 

    public ConsoleOutput() 
    { 
     stringWriter = new StringWriter(); 
     originalOutput = Console.Out; 
     Console.SetOut(stringWriter); 
    } 

    public string GetOuput() 
    { 
     return stringWriter.ToString(); 
    } 

    public void Dispose() 
    { 
     Console.SetOut(originalOutput); 
     stringWriter.Dispose(); 
    } 
} 

Aquí hay un ejemplo de cómo se usa:

using (var consoleOutput = new ConsoleOutput()) 
{ 
    target.WriteToConsole(text); 

    Assert.AreEqual(text, consoleOutput.GetOuput()); 
} 

puede encontrar información más detallada y una muestra de código de trabajo en mi blog aquí - Getting console output within a unit test.

+1

No ha leído las preguntas frecuentes sobre autopromoción. Cada respuesta que ha publicado ha sido un enlace a su blog. –

Cuestiones relacionadas