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

标签 c# nlog xunit xunit.net

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

最佳答案

您可以创建写入 Xunit 的 ITestOutputHelper 的自定义 NLog 目标:

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 成为一个抽象/基类,并编写其他测试类来继承它。

关于c# - 如何配置 xUnit 测试以与 NLog 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63504353/

相关文章:

c# - 跨 AppDomain 实现引用计数的最佳方式是什么?

visual-studio - 在 visual studio 2017 中安装 xunit.net

C# 锯齿状数组 : outside the bounds of the array issue

c# - Nuget PM 无法识别 Entity Framework Core 命令

c# - 来自不同项目的 NLog

c# - 如何将 NLog 中的自定义字段记录到数据库?

C# 使用 BouncyCaSTLe 使用 RSA 对数据进行签名

c# - 将地址与地址列表进行比较

c# - NLog有多灵活?我想要自定义布局属性

unit-testing - ExpectedException xunit .net core