我正在使用一个自定义的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 回答
可能对您有用的一个选项是配置接收器和/或 Logger 以刷新任何挂起的批次:
接收器直接实现IDisposable,因此:
...也可能实现这一目标 .