2010-02-19 13 views
6

Quiero capturar la salida enviada a la salida estándar y el error estándar dentro de una prueba de la unidad MSTest para que pueda verificarlo. He capturado la salida antes al ejecutar explícitamente un Process, pero ¿hay alguna manera de hacerlo con [supongo] el proceso MSTest en sí? Por ejemplo:comprobar la salida en la prueba de la unidad MSTest

[TestMethod] 
public void OutputTest() 
{ 
    MySnazzyMethod("input", 1, 'c'); 
    string stdOutFromMySnazzyMethod = /* ??? */; 
    Assert.AreEqual("expected output", stdOutFromMySnazzyMethod); 
} 

Respuesta

3

me ha gustado JaredPar's idea pero no quiero pasar en Console.Out y Console.Error a cada método de salida ayudante que tenía. Sin embargo, mi salida no ir a través de una sola clase, por lo que acaba de establecer un par de campos estáticos en ella:

internal static TextWriter _stdOut = Console.Out; 
internal static TextWriter _stdErr = Console.Error; 

he actualizado mis métodos de salida de la clase de controlador de salida para hacer uso de estos campos. entonces he actualizado que AssemblyInfo.cs del proyecto para incluir:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")] 

De esta manera, puedo anular _stdOut y _stdErr en mis métodos de prueba, llamar a mi método para ensayar (que utiliza mi clase Manejo de impresiones), y confirme la salida que esperaba.

OutputHandler._stdOut = new StringWriter(); 
MySnazzyMethod("input", 1, 'c'); 
OutputHandler._stdOut.Flush(); 
string expected = "expected output"; 
string stdout = OutputHandler._stdOut.ToString().Trim(new[] { '\r', '\n' }); 
Assert.IsFalse(string.IsNullOrEmpty(stdout)); 
Assert.AreEqual(expected, stdout); 
+0

Tenga cuidado con los campos estáticos en las clases de prueba. Si va a usarlos, asegúrese de establecer OutputHandler._stdOut y/o OutputHandler._stdErr al comienzo de cualquier prueba que los use. Los conjuntos de pruebas de unidades MSTest (pruebas no ordenadas) se ejecutan de forma no determinista, por lo que las pruebas posteriores en su ejecución pueden no tener estos campos configurados correctamente en Console.Out y Console.Error antes de que intenten usar esos TextWriters. (TestInitialize() y TestCleanup() tampoco garantizan ninguna seguridad contra esto.) – David

0

Sólo añadir un par TraceListener en la inicialización de clase de sus clases de prueba.

3

No estoy seguro de que haya una forma de obtener la salida de una ya ejecutada Process. Sin embargo, lo que podría hacer es refactorizar ligeramente su código para no escribir en Console.WriteLine, pero en su lugar, tome una instancia de TextWriter y escriba eso.

En producción, puede simplemente pasar Console.Out al método. En el código de prueba, puede simular este tipo y proporcionar pruebas mucho más precisas. Por ejemplo

[TestMethod] 
public void OutputTest() 
{ 
    var writer = new Mock<TextWriter>(MockBehavior.Strict); 
    writer.Setup(x => x.WriteLine("expected output")).Verifiable(); 
    MySnazzyMethod(writer.Object, "input", 1, 'c'); 
    writer.Verify(); 
} 

Código de Producción

MySnazzyMethod(Console.Out, "input", 1, 'c'); 
0

que haría uso de Moles para redirigir la llamada a Console escribe a un método lambda dentro de su código de prueba.

string result = ""; 
System.Moles.MConsole.WriteLineString = (s) => 
    { result = s; }; 
Assert.IsTrue(result == "The string I want", 
    "Failed to write to console correctly"); 

Véase la página 16 de este documento: Moles Reference Manual.

Cuestiones relacionadas