问题描述
要在测试类中启用输出,如以下答案xUnit.net does not capture console output中所述,您需要提供以下设置:
public class OutputTest
{
private readonly ITestOutputHelper _testOutputHelper;
public OutputTest(ITestOutputHelper testOutputHelper)
{
_testOutputHelper = testOutputHelper;
}
[Fact]
public void MyFact()
{
_testOutputHelper.WriteLine("Hello World!");
//this should result in writing to _testOutputHelper too
LogManager.GetCurrentClassLogger().Info("Hello World!");
}
}
如何将_testOutputHelper与NLog连接?通过NLog(在应用程序或引用的库中)完成某些日志记录后,是否可以写入ITestOutputHelper?
解决方法
您可以创建一个自定义的 NLog 目标来写入 Xunit 的 ITestOutputHelper
:
using NLog;
using NLog.Targets;
using Xunit.Abstractions;
namespace YourNamespace
{
/// <summary>
/// Writes log messages to Xunit's ITestOutputHelper.
/// </summary>
public class XunitLoggerTarget : TargetWithLayout
{
private readonly ITestOutputHelper helper;
public XunitLoggerTarget(ITestOutputHelper helper)
{
this.helper = helper;
}
protected override void Write(LogEventInfo logEvent)
{
var logMessage = Layout.Render(logEvent);
helper.WriteLine(logMessage);
}
}
}
然后,在您的 Xunit 测试类中,为 ITestOutputHelper
添加构造函数参数,并将 NLog 配置为使用 XunitLoggerTarget
:
using NLog;
using NLog.Config;
using Xunit.Abstractions;
namespace YourNamespace
{
public class NLoggedTest
{
public NLoggedTest(ITestOutputHelper testOutputHelper)
{
var config = new LoggingConfiguration();
var target = new XunitLoggerTarget(testOutputHelper);
config.AddTarget("Xunit",target);
config.LoggingRules.Add(new LoggingRule("*",LogLevel.Trace,target));
LogManager.Configuration = config;
}
// your tests/facts/theories here
}
}
您可以将 NLoggedTest
设为抽象/基类并编写其他测试类来继承它。
您可以使用 NLog MethodCallTarget 来调用 testOutputHelper
:
public class NLoggedTest
{
public NLoggedTest(ITestOutputHelper testOutputHelper)
{
var target = new NLog.Targets.MethodCallTarget("Xunit",(evt,args) => testOutputHelper.WriteLine(evt.FormattedMessage + evt.Exception?.ToString()));
var config = new LoggingConfiguration();
config.LoggingRules.Add(new LoggingRule("*",target));
LogManager.Configuration = config;
}
// your tests/facts/theories here
}