【问题标题】:Grabbing the output sent to Console.Out from within a unit test?从单元测试中获取发送到 Console.Out 的输出?
【发布时间】:2011-01-09 12:05:05
【问题描述】:

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

有没有办法从调用Program.Main(...) 的NUnit 测试方法中获取写入Console.OutConsole.Error 的所有内容,以便我可以验证它?

【问题讨论】:

  • 那是集成测试而不是单元测试。
  • 我同意,我正在重新设计解决方案布局以反映这一点。
  • 虽然它处于灰色地带,但我实际上并没有调用任何外部程序,只是在我的程序文件中调用代码,但我仍然认为它更像是集成测试而不是单元测试.

标签: c# unit-testing console nunit


【解决方案1】:

您可以像这样将Console.InConsole.OutConsole.Error 重定向到自定义的StringWriters

[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());
    }
}

详情请见this blog post

【讨论】:

  • 如果您使用 Resharper,您将失去所有进一步测试的输出屏幕:(
  • @EgorPavlikhin:您应该在每次测试结束时使用Console.SetOut(new StreamWriter(Console.OpenStandardError()) 重置标准输出(您可能还需要将Autoflush 设置为true)。在此之后,它将适用于任何测试运行程序,包括 R#。
  • @Abel,你的意思是 OpenStandardError 还是 OpenStandardOutput?
  • 我已经尝试过了,我似乎不需要 Console.SetOut(new StreamWriter(Console.OpenStandardError())
  • @Daryn: 在我的开场白中,您可以将其用于InOutError,或者换句话说,stdinstdout 和 @987654336 @。如果您不使用Console.SetOut,您将无法捕获字符串中的输出,因为无法直接从Console 类中获取它。在您的最后一条评论中,您在Console.SetOut 中使用了new StreamWriter...,这将不起作用(您无法访问它)并且会泄漏内存(使用using 语句)。
【解决方案2】:

您可以使用这个简单的类通过 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());
}

您可以在我的博客文章中找到更多详细信息和工作代码示例 - Getting console output within a unit test

【讨论】:

  • 您还没有阅读自我推销常见问题解答。您发布的每个答案都是您博客的链接。
  • Andrew 我认为这个答案可能属于此处列出的可接受标准meta.stackexchange.com/questions/94022/… 还可以建议以“您还没有阅读”开头的内容没有它可能那么友好。您可以建议他们通过链接阅读常见问题解答 :) meta.stackexchange.com/questions/7931/…
  • 我正在使用这个类,我发现如果我单独运行每个测试输出是正确的,但是如果我连续运行所有测试,那么只有第一个测试成功。其他测试失败,因为 GetOutput 中没有任何内容。好像标准输出在第一次测试后没有正确重置,尽管变量“originalOutput”正是出于这个原因。
猜你喜欢
  • 2014-01-27
  • 2017-02-05
  • 2020-01-09
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多