2016-03-17 5 views
1

Я работаю над пользовательской раковиной Serilog, наследующей от PeriodicBatchingSink и вызывая мой веб-сервис для записи данных в db, используя шаблон, подобный Serilog.Sinks.Seq. Используя этот код в качестве примера https://github.com/serilog/serilog-sinks-seq/blob/dev/src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs Я переопределяю EmitBatchAsync и оттуда вызываю свой веб-сервис.Единичное тестирование пользовательской раковины 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, ни overridden 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