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);
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