检查MSTest单元测试中的输出

Sar*_*els 7 c# mstest stdout redirectstandardoutput

我想捕获发送到标准输出的输出和MSTest单元测试中的标准错误,以便我可以验证它.我在明确运行a之前捕获了输出Process,但有没有办法处理[我猜] MSTest进程本身?例如:

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

Sar*_*els 3

我喜欢JaredPar 的想法,但我不想传入Console.Out并传递Console.Error给我拥有的每个辅助输出方法。然而,我的输出确实通过一个类,所以我只在其中设置了几个静态字段:

internal static TextWriter _stdOut = Console.Out;
internal static TextWriter _stdErr = Console.Error;
Run Code Online (Sandbox Code Playgroud)

我更新了输出处理程序类中的输出方法以使用这些字段。然后我更新了该项目的 AssemblyInfo.cs 以包括:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")]
Run Code Online (Sandbox Code Playgroud)

这样,我可以在我的测试方法中重写_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);
Run Code Online (Sandbox Code Playgroud)