【问题标题】:Redirect console output for just one method仅针对一种方法重定向控制台输出
【发布时间】:2014-11-23 14:06:46
【问题描述】:

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

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

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

谢谢!

更新

其实是需要重定向的错误输出...

【问题讨论】:

    标签: c# console output


    【解决方案1】:

    是的,您可以将输出流临时替换为自定义流。可以使用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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这个非常完美,特别适用于第三方应用程序在测试期间在我们的构建服务器中抛出消息..
      • 很好地重用了现有的编写器和输出流!对于临时输出重定向,这似乎比打开另一个输出流更轻量。
      猜你喜欢
      • 2013-06-17
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 2015-09-11
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多