2010-02-19 18 views
6

Chcę przechwycić dane wyjściowe wysłane do standardowego wyjścia i standardowego błędu w teście MSTest jednostki, aby móc go zweryfikować. Przechwyciłem dane wyjściowe przed jawnym uruchomieniem Process, ale czy istnieje sposób na [sam] proces MSTest? Na przykład:Sprawdź dane wyjściowe w teście MSTest jednostki

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

Odpowiedz

3

lubiłem JaredPar's idea ale nie chciałem przekazać w Console.Out i Console.Error do każdej metody wyjściowego pomocnik miałem. Jednak moje wyjście ma przejść do jednej klasy, więc po prostu ustawić kilka pól statycznych w nim:

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

zaktualizowałem moich metod produkcji w klasie programu obsługi wyjścia do korzystania z tych pól. I następnie aktualizowany że AssemblyInfo.cs projektu obejmuje:

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

ten sposób mogę zastąpić _stdOut i _stdErr w moich metod badawczych, zadzwoń do mojej metody do badania (co wykorzystuje moją klasę obsługi wyjścia) i potwierdź wyjście, którego się spodziewałem.

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

Należy zachować ostrożność w przypadku pól statycznych w klasach testowych. Jeśli zamierzasz z nich korzystać, upewnij się, że ustawiłeś OutputHandler._stdout i/lub OutputHandler._stdErr na początku każdego testu, który ich używa. Zestawy testów jednostkowych MSTest (nie zamówione testy) działają w sposób niedeterministyczny, więc późniejsze testy w twoim biegu mogą nie mieć prawidłowo ustawionych pól w Console.Out i Console.Error, zanim spróbują użyć tych TextWriters. (TestInitialize() i TestCleanup() również nie gwarantują żadnego bezpieczeństwa.) – David

0

Wystarczy dodać kilka TraceListener w klasie initialize swoich klasach testowych.

3

Nie jestem pewien, czy istnieje sposób, aby pobrać wyjście już działającego Process. To, co możesz zrobić, to jednak nieznacznie poprawić kod, aby nie pisać do Console.WriteLine, ale zamiast tego weź instancję TextWriter i napisz do tego.

W produkcji można następnie po prostu przekazać do metody Console.Out. W kodzie testowym można wyśmiać ten typ i zapewnić znacznie dokładniejsze testy. Na przykład

[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(); 
} 

kod produkcji

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

użyję mola do przekierowania połączenia do Console pisze sposobu lambda wewnątrz kodu testowego.

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

Patrz strona 16 w tym dokumencie: Moles Reference Manual.

Powiązane problemy