【发布时间】:2014-11-23 14:06:46
【问题描述】:
我这里有一堆单元测试。其中之一希望代码什么也不做,因为参数解析不应该起作用。
不幸的是,在这种情况下,我使用的参数解析库强制 Console.Write(),现在我的单元测试输出中充满了库的消息,这使得它难以阅读。
有没有办法在调用此方法之前将标准控制台输出重定向到任何内容(或临时文件或其他任何内容),然后在完成后将其重定向回标准输出?
谢谢!
更新
其实是需要重定向的错误输出...
【问题讨论】:
我这里有一堆单元测试。其中之一希望代码什么也不做,因为参数解析不应该起作用。
不幸的是,在这种情况下,我使用的参数解析库强制 Console.Write(),现在我的单元测试输出中充满了库的消息,这使得它难以阅读。
有没有办法在调用此方法之前将标准控制台输出重定向到任何内容(或临时文件或其他任何内容),然后在完成后将其重定向回标准输出?
谢谢!
其实是需要重定向的错误输出...
【问题讨论】:
是的,您可以将输出流临时替换为自定义流。可以使用Console.SetOut() 方法完成。或多或少(适应您的实际代码,另见 cmets):
// 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");
【讨论】: