【发布时间】: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