首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xUnit.net不捕获控制台输出

xUnit.net不捕获控制台输出
EN

Stack Overflow用户
提问于 2011-08-21 22:42:44
回答 7查看 30.9K关注 0票数 58

我刚开始测试xUnit.net,但它似乎没有捕获任何输出(控制台、调试、跟踪),正如我所预期的那样。

这有可能吗?我在xUnit.net 1.8中使用了一个示例.NET 4.0类库。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-08-23 18:13:09

一般来说,依赖日志记录和测试是一条糟糕的道路。通过/失败应该是测试的结果。而且他们根本不应该到达有足够多的东西在进行的阶段,以至于有必要查看跟踪。

xunit.gui.exe显示控制台和跟踪输出,而xunit.console.exe不显示。如果它很重要,你可以通过建立适当的标准.NET配置项来连接一个重定向到一个文件的TraceListener (这是一个FileWriterTraceListener,如果你在谷歌上搜索它,你应该能够连接到它)。

更新:正如在his blog post中所讨论的,Damian Hickey有一个很好的替代方案--将日志连接到xUnit 2 ITestOutputHelper,如https://github.com/damianh/CapturingLogOutputWithXunit2AndParallelTests/blob/master/src/Lib.Tests/Tests.cs中所示

更新2:在某些情况下,可以使用如下所示的简单适配器添加日志记录并将其提供给ITestOutputHelper,而不涉及LogContext (对不起,我只有F#版本):

代码语言:javascript
复制
// Requirement: Make SUT depend on Serilog NuGet
// Requirement: Make Tests depend on Serilog.Sinks.Observable

type TestOutputAdapter(testOutput : Xunit.Abstractions.ITestOutputHelper) =
    let formatter = Serilog.Formatting.Display.MessageTemplateTextFormatter(
        "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}", null);
    let write logEvent =
        use writer = new System.IO.StringWriter()
        formatter.Format(logEvent, writer);
        writer |> string |> testOutput.WriteLine
    member __.Subscribe(source: IObservable<Serilog.Events.LogEvent>) =
        source.Subscribe write

let createLogger hookObservers =
    LoggerConfiguration()
        .WriteTo.Observers(Action<_> hookObservers)
        .CreateLogger()
let createTestOutputLogger (output: ITestOutputHelper) =
    let adapter = TestOutputAdapter testOutputHelper
    createLogger (adapter.Subscribe >> ignore)

type Tests(testOutputHelper) =
    let log = createTestOutputLogger testOutputHelper

    [<Fact>] let feedToSut () =
        // TODO pass log to System Under Test either as a ctor arg or a method arg

这种方法与使用日志上下文的不同之处在于,到全局上下文Serilog Logger的日志记录将不会被拾取。

票数 -9
EN

Stack Overflow用户

发布于 2015-06-26 00:06:31

xUnit.net 2的情况发生了一些变化。我知道问题是关于早期版本的,但由于人们将在这里进行升级,我认为值得指出这一点。

为了在版本2的测试输出中看到某种类型的输出,您需要在测试类中获取对Xunit.Abstractions.ITestOutputHelper实例的依赖(通过构造函数参数),然后在此接口上使用WriteLine方法。例如:

代码语言:javascript
复制
public class MyTestSpec
{
  private readonly ITestOutputHelper _testOutputHelper;

  public MyTestSpec(ITestOutputHelper testOutputHelper)
  {
    _testOutputHelper = testOutputHelper;
  }

  [Fact]
  public void MyFact()
  {
    _testOutputHelper.WriteLine("Hello world");
  }
}

您可以选择将日志记录框架连接到此接口,方法可能是注入一个将所有调用转发到ITestOutpuHelperILog实现。

我承认您在默认情况下不希望这样做,但出于诊断目的,它有时会非常有用。当你的测试只在一些基于云的构建和测试服务器上失败时,这一点尤其正确!

票数 67
EN

Stack Overflow用户

发布于 2017-11-28 18:34:16

如果您的Console.Write嵌入在某些您不想重构的类层次结构的深层,这会很有帮助:

代码语言:javascript
复制
    public MyTestClass(ITestOutputHelper output)
    {
        var converter = new Converter(output);
        Console.SetOut(converter);
    }

    private class Converter : TextWriter
    {
        ITestOutputHelper _output;
        public Converter(ITestOutputHelper output)
        {
            _output = output;
        }
        public override Encoding Encoding
        {
            get { return Encoding.Whatever; }
        }
        public override void WriteLine(string message)
        {
            _output.WriteLine(message);
        }
        public override void WriteLine(string format, params object[] args)
        {
            _output.WriteLine(format, args);
        }

        public override void Write(char value)
        {
            throw new NotSupportedException("This text writer only supports WriteLine(string) and WriteLine(string, params object[]).");
        }
    }
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7138935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档