【问题标题】:How to configure xUnit test to work with NLog?如何配置 xUnit 测试以使用 NLog?
【发布时间】:2020-08-20 11:44:31
【问题描述】:

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

【问题讨论】:

  • 这里有什么想法?写入 ITestOutputHelper,最终会写入 NLog 并写入文件/控制台?为什么要直接写入 NLog?
  • xUnit 中的控制台已禁用。当 NLog 完成一些日志记录(在应用程序或引用的库中)时,是否可以写入 ITestOutputHelper?
  • 也许扩展您问题中的示例?

标签: c# nlog xunit xunit.net


【解决方案1】:

您可以创建一个自定义 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 设为抽象/基类,并编写其他测试类来继承它。

【讨论】:

    【解决方案2】:

    您可以使用 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("*", LogLevel.Trace, target));
            LogManager.Configuration = config;
        }
    
        // your tests/facts/theories here
    }
    

    另请参阅:https://github.com/NLog/NLog/wiki/MethodCall-target

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 2011-02-12
      • 1970-01-01
      • 2017-10-04
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多