2016-03-17 54 views
1

我正在從一個定製的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服務。單元測試自定義Serilog接收器

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往返,但找不出如何等待任務完成,使用異步和等待不起作用 - 記錄器仍然處理所有的日誌事件異步,並且測試完成而無需等待。 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」)的最佳方式是什麼?可能爲你工作

回答

0

一種選擇是處置水槽和/或記錄刷新任何掛起的批次:

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

水槽直接實現IDisposable,所以:

testSink.Dispose(); 

..也可能會實現這一點。

+0

我會試試這個,謝謝。可能需要將此與將接收事件添加到接收器並將其添加到測試結束以驗證日誌已通過: testSink.ShouldRaise(「ResponseReceived」) .WithSender(testSink); – Nixit