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

那可能吗?我正在使用带有 xUnit.net 1.8 的示例 .NET 4.0 类库。

最佳答案

一般来说,依赖日志记录和测试是一条糟糕的道路。通过/失败应该是测试的结果。他们根本不应该到有足够多的事情发生以至于需要查看跟踪的阶段。
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# 中有它,抱歉):

// 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

关于xUnit.net 不捕获控制台输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7138935/

10-14 15:44