有没有办法在 .NET Core 的单元测试中查看生成的日志消息?

Posted

技术标签:

【中文标题】有没有办法在 .NET Core 的单元测试中查看生成的日志消息?【英文标题】:Is there way to see log messages generated in a unit test in .NET Core? 【发布时间】:2017-06-02 06:32:07 【问题描述】:

我在 .NET Core 中有一个带有单元测试的 C# 项目。为了在测试期间更好地检查代码流,我真的很想看看代码库中内置的 NLog 消息的输出。

我正在使用 XUnit,并且我知道 XUnit 由于并行测试执行而远离了控制台消息。对于我想使用ITestOutputHelper 完成的工作不会有太大帮助。

有没有办法让 NLog 日志记录包含在测试输出中?

【问题讨论】:

【参考方案1】:

我使用这样的东西:

namespace Tests.Builders

    internal static class Logging
    
        public static ILogger DefaultLogger()
        
            return NullLogger();
        

        public static ILogger NullLogger()
        
            return Substitute.For<ILogger>();
        

        public static ILogger XUnitLogger(ITestOutputHelper testOutputHelper)
        
            // Step 1. Create configuration object 
            var config = new LoggingConfiguration();

            // Step 2. Create targets and add them to the configuration 
            var consoleTarget = new XUnitTarget(testOutputHelper);
            config.AddTarget("xunit", consoleTarget);

            // Step 3. Set target properties 
            consoleTarget.Layout = @"$date:format=HH\:mm\:ss $logger $message";

            // Step 4. Define rules
            var rule1 = new LoggingRule("*", LogLevel.Trace, consoleTarget);
            config.LoggingRules.Add(rule1);

            // Step 5. Activate the configuration
            LogManager.Configuration = config;

            return LogManager.GetLogger("");
        
    

    [Target("XUnit")]
    public sealed class XUnitTarget : TargetWithLayout
    
        private readonly ITestOutputHelper _output;

        public XUnitTarget(ITestOutputHelper testOutputHelper)
        
            _output = testOutputHelper;
        

        protected override void Write(LogEventInfo logEvent)
        
            string logMessage = this.Layout.Render(logEvent);

            _output.WriteLine(logMessage);
        
    


public class SomeTests

    private readonly ITestOutputHelper _output;

    public SomeTests(ITestOutputHelper output)
    
        _output = output;
    

    [Fact]
    public void Lets_see_some_output()
    
        var foo = new Foo(Logging.XUnitLogger(_output));

        var result = foo.ExecuteSomething();

        Assert.Equal(true, result);
    

【讨论】:

以上是关于有没有办法在 .NET Core 的单元测试中查看生成的日志消息?的主要内容,如果未能解决你的问题,请参考以下文章

.Net core基于xUnit的单元测试查看测试覆盖率

.Net core基于xUnit的单元测试查看测试覆盖率

.Net core基于xUnit的单元测试查看测试覆盖率

我正在为我的测试项目使用 MStest (.net core),有没有办法在失败时继续执行测试?

如何在 Bamboo 中运行 .NET Core 单元测试?

在 .net core 上的单元测试中使用和注入 appsettings.json