【问题标题】:Unit testing custom Serilog sink单元测试自定义 Serilog 接收器
【发布时间】:2016-03-17 14:27:23
【问题描述】:

我正在开发一个自定义 Serilog 接收器,从 PeriodicBatchingSink 继承并调用我的 Web 服务将数据写入数据库,使用类似于 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 往返,但不知道如何等待任务完成,使用 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 页面上的示例测试并没有太大帮助,甚至那里的 cmets 也会说“// 这里有一些非常非常近似的测试 :)”,或者我可能遗漏了一些东西。 或者可能是因为我对 Serilog 和异步测试都是新手。

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

【问题讨论】:

  • 你有没有得到这个工作?我一直在尝试做类似的事情并遇到依赖注入的各种问题并获取我的 DbContext 实例。我很好奇你是怎么弄出来的。

标签: c# unit-testing asynchronous xunit serilog


【解决方案1】:

可能对您有用的一个选项是处置接收器和/或记录器以刷新任何待处理的批次:

[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();
}

sink直接实现了IDisposable,所以:

    testSink.Dispose();

...可能也会实现这一点。

【讨论】:

  • 我会试试这个,谢谢。可能需要将此与向接收器添加委托事件并将其添加到测试末尾以验证日志是否通过:testSink.ShouldRaise("ResponseReceived") .WithSender(testSink);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多