我正在开发一个自定义Serilog接收器,继承自PeriodicBatchingSink并调用我的Web服务将数据写入db,使用类似于Serilog.Sinks.Seq的模式。使用此代码作为示例DEMO我将覆盖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页面上的示例测试没有多大帮助,即使是那里的评论&#34; //这里有一些非常非常近似的测试:)&#34;或者也许我错过了什么。 或许这可能是我对Serilog和异步测试都不熟悉的事实。
在这种情况下,对单元测试Log.Debug(&#34; msg&#34;)的最佳方法是什么?
答案 0 :(得分:2)
可能对您有用的一个选项是配置接收器和/或记录器以刷新任何待处理的批次:
testSink.Dispose();
接收器直接实现IDisposable,所以:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
......也可能实现这一点。