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

9
我这里有一堆单元测试。其中一个期望代码不执行任何操作,因为参数解析不应该起作用。

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

是否有一种方法在调用此方法之前将标准控制台输出重定向到空(或临时文件或其他内容),然后在完成后将其重定向回标准输出?

谢谢!

更新

实际上需要重定向错误输出...

2个回答

17

是的,你可以暂时使用自定义输出流来替换输出流。这可以通过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);

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

Console.SetError(new StringWriter());

// Your code here...

var standardError = new StreamWriter(Console.OpenStandardError());
standardError.AutoFlush = true;
Console.SetError(standardError);

13
你可以创建一个不执行任何操作的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");

这个非常完美,特别是针对第三方应用程序在我们的构建服务器上进行测试期间抛出消息的情况。 - Alan
很好地重用了现有的写入器和输出流!对于临时输出重定向,这似乎比打开另一个输出流更轻量级。 - CodeFox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接