gpt4 book ai didi

c# - 单元测试自定义 Serilog 接收器

转载 作者:行者123 更新时间:2023-11-30 23:28:19 28 4
gpt4 key购买 nike

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

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 不起作用 - 记录器仍然异步处理所有日志事件,并且测试完成无需等待。 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") 的最佳方法是什么?

最佳答案

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

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

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

关于c# - 单元测试自定义 Serilog 接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36063435/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com