如何配置xUnit测试以与NLog一起使用?

问题描述

要在测试类中启用输出,如以下答案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
}

另见:https://github.com/NLog/NLog/wiki/MethodCall-target