我想在MSTest单元测试中捕获发送到标准输出和标准错误的输出,以便我可以验证它。我在明确运行Process
之前捕获了输出,但有没有办法处理[我猜] MSTest进程本身?例如:
[TestMethod]
public void OutputTest()
{
MySnazzyMethod("input", 1, 'c');
string stdOutFromMySnazzyMethod = /* ??? */;
Assert.AreEqual("expected output", stdOutFromMySnazzyMethod);
}
答案 0 :(得分:3)
我不确定是否有办法获取已经运行的Process
的输出。你可以做的是稍微重构你的代码,不要写入Console.WriteLine
,而是接受TextWriter
实例并写入。
在制作中,您只需将Console.Out
传递给该方法即可。在测试代码中,您可以模拟此类型并提供更准确的测试。例如
[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();
}
生产代码
MySnazzyMethod(Console.Out, "input", 1, 'c');
答案 1 :(得分:3)
我喜欢JaredPar's idea,但我不想将Console.Out
和Console.Error
传递给我拥有的每个帮助器输出方法。但是,我的输出确实经历了一个类,所以我只在其中设置了几个静态字段:
internal static TextWriter _stdOut = Console.Out;
internal static TextWriter _stdErr = Console.Error;
我更新了输出处理程序类中的输出方法以使用这些字段。然后我更新了该项目的AssemblyInfo.cs以包括:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")]
这样,我可以在我的测试方法中覆盖_stdOut
和_stdErr
,调用我的方法进行测试(使用我的输出处理类),并确认我预期的输出。
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);
答案 2 :(得分:0)
只需在测试类的类初始化中添加几个TraceListener。
答案 3 :(得分:0)
我使用Moles将调用重定向到Console
写入测试代码中的lambda方法。
string result = "";
System.Moles.MConsole.WriteLineString = (s) =>
{ result = s; };
Assert.IsTrue(result == "The string I want",
"Failed to write to console correctly");
请参阅本文档第16页:Moles Reference Manual。