单元测试定制Serilog水槽

时间:2016-03-17 14:27:23

标签: c# unit-testing asynchronous xunit serilog

我正在开发一个自定义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;)的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

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

    testSink.Dispose();

接收器直接实现IDisposable,所以:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="@string/google_maps_key" />

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