首页 文章

单元测试定制Serilog水槽

提问于
浏览
2

我正在使用一个自定义的Serilog接收器,继承自PeriodicBatchingSink并调用我的Web服务将数据写入db,使用类似于Serilog.Sinks.Seq的模式 . 使用此代码作为示例https://github.com/serilog/serilog-sinks-seq/blob/dev/src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs我正在重写EmitBatchAsync并从那里调用我的Web服务 .

public AppSink(string serverUrl, int batchSizeLimit,
                            TimeSpan period, long? eventBodyLimitBytes))
            : base(batchSizeLimit, period)
    {
        ...
    }

    protected override async Task EmitBatchAsync(IEnumerable<LogEvent> events)
    {
        ...
        var result = await _httpClient.PostAsJsonAsync(Uri, logEntriesList);
    }

尝试编写一些xunit测试来测试实际的LogEvent往返,但无法确定如何等待Task完成,使用async和await不起作用 - logger仍然异步处理所有日志事件,测试完成而无需等待 . Log.Debug和重写的EmitBatchAsync都不返回任何内容 .

这只是我要测试的一个示例:

[Fact]
    public void Test_LogMessages()
    {
        InitAppSink();

        Log.Logger = new LoggerConfiguration().ReadFrom.AppSettings()
            .WriteTo.Sink(testSink)
            .MinimumLevel.ControlledBy(_levelSwitch)
            .CreateLogger();

        Log.Information("Information Test Log Entry");
        Log.Debug("Debug Test Log Entry");
    }

Serilog页面上的示例测试没有多大帮助,甚至有评论说“//这里有一些非常非常近似的测试:)”,或者我可能遗漏了一些东西 . 或者也许是我对Serilog和异步测试都不熟悉的事实 .

在这种情况下,对单元测试Log.Debug(“msg”)的最佳方法是什么?

1 回答

  • 2

    可能对您有用的一个选项是配置接收器和/或 Logger 以刷新任何挂起的批次:

    [Fact]
    public void Test_LogMessages()
    {
        InitAppSink();
    
        var logger = new LoggerConfiguration().ReadFrom.AppSettings()
            .WriteTo.Sink(testSink)
            .MinimumLevel.ControlledBy(_levelSwitch)
            .CreateLogger();
    
        logger.Information("Information Test Log Entry");
        logger.Debug("Debug Test Log Entry");
        ((IDisposable)logger).Dispose();
    }
    

    接收器直接实现IDisposable,因此:

    testSink.Dispose();
    

    ...也可能实现这一目标 .

相关问题