仅为一个方法重定向控制台输出

本文关键字:方法 重定向 控制台 输出 一个 | 更新日期: 2023-09-27 18:24:58

我这里有一堆单元测试。其中一个期望代码什么也不做,因为参数解析不应该工作。

不幸的是,在这种情况下,我使用的参数解析库强制Console.Write(),而现在我的单元测试输出中充满了库的消息,这使得它很难阅读。

在调用这个方法之前,有没有一种方法可以将标准控制台输出重定向为空(或临时文件或其他什么),然后在完成后将其重定向回标准输出?

谢谢!

更新

实际上,需要重定向的是错误输出。。。

仅为一个方法重定向控制台输出

是的,您可以用自定义流临时替换输出流。它可以通过Console.SetOut()方法来完成。或多或少(适应您的实际代码,另请参阅注释):

// We're not interested in its output, a NULL fake one may also work (better)
Console.SetOut(new StringWriter());
// Your code here...
// Now you have to restore default output stream
var standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);

更新:根据您的更新(重定向标准错误流),您只需将*Out替换为*Error:

Console.SetError(new StringWriter());
// Your code here...
var standardError = new StreamWriter(Console.OpenStandardError());
standardError.AutoFlush = true;
Console.SetError(standardError);

您可以创建一个什么都不做的TextWriter

public sealed class NulTextWriter: TextWriter
{
    public override Encoding Encoding
    {
        get
        {
            return Encoding.UTF8;
        }
    }
}

然后您可以设置并恢复控制台输出,如下所示:

Console.WriteLine("Enabled");
var saved = Console.Out;
Console.SetOut(new NulTextWriter());
Console.WriteLine("This should not appear");
Console.SetOut(saved);
Console.WriteLine("Restored");

您可以对控制台的错误输出使用相同的方法:

Console.Error.WriteLine("Enabled");
var saved = Console.Error;
Console.SetError(new NulTextWriter());
Console.Error.WriteLine("This should not appear");
Console.SetError(saved);
Console.Error.WriteLine("Restored");