【问题标题】:.net core 2.0 ConfigureLogging xunit test.net core 2.0 ConfigureLogging xunit 测试
【发布时间】:2018-02-20 11:46:10
【问题描述】:

在我的 .NET Core 2.0 项目中的 xUnit 集成测试中,我无法在终端中看到也打印测试结果的日志消息。当代码在 WebHost 环境中运行时,日志会打印到控制台。

这是我在测试构造函数中配置日志记录的方式:

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.Tests.json")
    .Build();

var services = new ServiceCollection();

services.AddLogging(options => {
    options.AddConfiguration(config.GetSection("Logging"));
    options.AddConsole();
    options.AddDebug();
});

var serviceProvider = services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Test");
logger.LogError("From ctor");

但我没有看到任何日志消息。

【问题讨论】:

    标签: c# logging asp.net-core xunit


    【解决方案1】:

    xUnit 在版本 2 中已更改为不再捕获测试的标准输出:

    如果您使用 xUnit.net 1.x,您之前可能已经将输出写入 Console、Debug 或 Trace。当 xUnit.net v2 默认开启并行化时,这种输出捕获机制不再适用;不可能知道可以并行运行的许多测试中的哪一个负责写入这些共享资源。

    相反,您现在应该使用an explicit mechanism 写入测试输出。基本上,您不是写到控制台,而是写到一个特殊的ITestOutputHelper。

    当然,ASP.NET Core 日志默认不支持这种输出机制。幸运的是,为测试输出编写日志提供程序并不太难。我刚刚实现了一个快速提供程序,并将其包含在下面的答案中。你可以这样使用它:

    public class Example
    {
        private readonly ILogger<Example> _logger;
    
        public Example(ITestOutputHelper testOutputHelper)
        {
            var loggerFactory = LoggerFactory.Create(l =>
            {
                l.AddProvider(new XunitLoggerProvider(testOutputHelper));
            });
            _logger = loggerFactory.CreateLogger<Example>();
        }
    
        [Fact]
        public void Test()
        {
            _logger.LogDebug("Foo bar baz");
        }
    }
    

    请注意,您通常应该避免在单元测试中创建完整的依赖注入容器。在单元测试中使用 DI 通常表明您的单元测试不是 unit 测试,而是集成测试。在单元测试中,您应该只测试一个特定单元并显式传递其所有依赖项——而不是经常作为模拟。正如您在上面的示例中看到的那样,创建一个记录器实际上是一件非常简单的事情,无需 DI。


    正如所承诺的,这是运行上面显示的代码并将Microsoft.Extensions.Logging 框架与xUnit 测试输出集成所需的XunitLoggerProvider 和XunitLogger:

    public class XunitLoggerProvider : ILoggerProvider
    {
        private readonly ITestOutputHelper _testOutputHelper;
    
        public XunitLoggerProvider(ITestOutputHelper testOutputHelper)
        {
            _testOutputHelper = testOutputHelper;
        }
    
        public ILogger CreateLogger(string categoryName)
            => new XunitLogger(_testOutputHelper, categoryName);
    
        public void Dispose()
        { }
    }
    
    public class XunitLogger : ILogger
    {
        private readonly ITestOutputHelper _testOutputHelper;
        private readonly string _categoryName;
    
        public XunitLogger(ITestOutputHelper testOutputHelper, string categoryName)
        {
            _testOutputHelper = testOutputHelper;
            _categoryName = categoryName;
        }
    
        public IDisposable BeginScope<TState>(TState state)
            => NoopDisposable.Instance;
    
        public bool IsEnabled(LogLevel logLevel)
            => true;
    
        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            _testOutputHelper.WriteLine($"{_categoryName} [{eventId}] {formatter(state, exception)}");
            if (exception != null)
                _testOutputHelper.WriteLine(exception.ToString());
        }
    
        private class NoopDisposable : IDisposable
        {
            public static readonly NoopDisposable Instance = new NoopDisposable();
            public void Dispose()
            { }
        }
    }
    

    【讨论】:

    • 谢谢。 1)我知道这不是单元测试。我在这里的集成测试中要做的是查看在本地评估某些查询时实体框架记录的警告。我会更新这个问题。 2)我把你的课挂了。 XunitLogger 的 Log 方法被调用,我在 OmniSharp 日志中看到格式错误的输出,但是当我运行 dotnet 测试时,我在 .NET 测试日志和终端输出中都没有看到它。
    • @Max 要查看控制台运行程序的输出,您需要使用dotnet-xunit CLI 工具(dotnet test 功能不够强大)并运行`dotnet xunit -diagnostics`。不过,输出将自动正确显示在 Visual Studio 中。
    • 所以还没有这样的内容? (只是问,因为这已经一年多了)
    • @Simon_Weaver 不,xUnit 仍然不会捕获控制台输出(出于相同的原因),并且没有提供内置记录器。
    • 如何让这个记录器输出显示在 Visual Studio 2017 [ / 2019 ] |输出 |运行[或调试] .net core xunit 测试时的测试窗格?
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 2018-04-21
    • 2018-01-28
    • 2018-03-17
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多