C# 从单元测试中获取发送到Console.Out的输出?

C# 从单元测试中获取发送到Console.Out的输出?,c#,unit-testing,console,nunit,C#,Unit Testing,Console,Nunit,我正在用NUnit用C#构建一个单元测试,我想测试主程序是否根据命令行参数实际输出正确的输出 NUnit测试方法调用Program.Main(…)来获取写入的所有内容,以便我可以对其进行验证,有什么办法吗?您可以重定向到自定义StringWriter,如下所示 [TestMethod] public void ValidateConsoleOutput() { using (StringWriter sw = new StringWriter()) { Conso

我正在用NUnit用C#构建一个单元测试,我想测试主程序是否根据命令行参数实际输出正确的输出

NUnit测试方法调用
Program.Main(…)
来获取写入的所有内容,以便我可以对其进行验证,有什么办法吗?

您可以重定向到自定义StringWriter,如下所示

[TestMethod]
public void ValidateConsoleOutput()
{
    using (StringWriter sw = new StringWriter())
    {
        Console.SetOut(sw);

        ConsoleUser cu = new ConsoleUser();
        cu.DoWork();

        string expected = string.Format("Ploeh{0}", Environment.NewLine);
        Assert.AreEqual<string>(expected, sw.ToString());
    }
}
[TestMethod]
public void ValidateConsoleOutput()
{
使用(StringWriter sw=new StringWriter())
{
控制台放样(sw);
控制台用户cu=新控制台用户();
cu.DoWork();
字符串应为string.Format(“Ploeh{0}”,Environment.NewLine);
Assert.AreEqual(应为sw.ToString());
}
}

有关完整详细信息,请参阅。

您可以使用这个简单的类通过using语句获取输出:

public class ConsoleOutput : IDisposable
{
    private StringWriter stringWriter;
    private TextWriter originalOutput;

    public ConsoleOutput()
    {
        stringWriter = new StringWriter();
        originalOutput = Console.Out;
        Console.SetOut(stringWriter);
    }

    public string GetOuput()
    {
        return stringWriter.ToString();
    }

    public void Dispose()
    {
        Console.SetOut(originalOutput);
        stringWriter.Dispose();
    }
}
下面是一个如何使用它的示例:

using (var consoleOutput = new ConsoleOutput())
{
    target.WriteToConsole(text);

    Assert.AreEqual(text, consoleOutput.GetOuput());
}

您可以在我的博客文章中找到更详细的信息和工作代码示例-。

这是一个集成测试,而不是单元测试。我同意,我现在正在修改解决方案布局以反映这一点。虽然它处于某种灰色区域,但我实际上并没有调用任何外部程序,只是调用程序文件中的代码,但我仍然认为它更像是一个集成测试,而不是单元测试。如果您使用Resharper,您将失去所有后续测试的输出屏幕,因为这样做:(@EgorPavlikhin:您应该在每个测试结束时使用
Console.SetOut(新的StreamWriter(Console.OpenStandardError())
(您可能还需要将
Autoflush
设置为true)。之后,它将与任何测试运行程序一起工作,包括R#。@Abel,您的意思是OpenStandardError还是OpenStandardOutput?我已经尝试过了,似乎不需要Console.SetOut(新的StreamWriter(Console.OpenStandardError())@达林:就像我的开场白一样,你可以用它来表示
in
Out
Error
,或者换句话说,
stdin
stdout
、和
stderr
。如果你不使用
控制台。SetOut
,你将无法捕获字符串中的输出,因为无法从
控制台获取它
直接初始化。在您的最后一条评论中,您在
控制台内使用了
新StreamWriter…
。SetOut
,这将无效(您无法访问它)并会泄漏内存(使用
using
语句)。您尚未阅读自我推广常见问题解答。您发布的每一个答案都是您博客的链接。Andrew我认为此答案可能符合此处列出的可接受性标准,也可能表明以“您未阅读”开头的回答可能不够友好。您可以建议他们阅读带有链接的常见问题解答:)