我刚刚开始测试 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/