检查MSTest单元测试中的输出

时间:2010-02-19 17:40:18

标签: c# mstest stdout redirectstandardoutput

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

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

4 个答案:

答案 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.OutConsole.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