mochte ich JaredPar's idea aber ich wollte nicht in Console.Out
und Console.Error
jeden Helfer Ausgang Methode zu übergeben. Allerdings ist mein Ausgang über eine einzige Klasse gehen, so dass ich setze nur ein paar statische Felder in ihm:
internal static TextWriter _stdOut = Console.Out;
internal static TextWriter _stdErr = Console.Error;
ich meine Ausgabemethoden in der Ausgabe-Handler-Klasse aktualisiert, um die Verwendung dieser Felder zu machen. Ich habe dann aktualisiert, dass Projekt AssemblyInfo.cs enthält:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")]
Auf diese Weise, ich _stdOut
und _stdErr
in meinen Testmethoden außer Kraft setzen kann, rufen Sie meine Methode getestet werden (was meine Ausgabe Handling-Klasse verwendet), und bestätigen Sie die Ausgabe habe ich erwartet.
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);
Seien Sie mit statischen Feldern in Testklassen vorsichtig. Stellen Sie sicher, dass Sie OutputHandler._stdOut und/oder OutputHandler._stdErr zu Beginn jedes Tests, der sie verwendet, festlegen, wenn Sie sie verwenden werden. MSTest Unit-Test-Suiten (nicht bestellt Tests) in einer nichtdeterministische Art und Weise ausgeführt werden, so dass spätere Tests in Ihrem Laufe haben diese Felder nicht richtig eingestellt zu Console.Out und Console.Error, bevor sie versuchen, diese TextWriters zu verwenden. (TestInitialize() und TestCleanup() garantieren auch keine Sicherheit.) – David