Я работаю над пользовательской раковиной 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») в этом случае?
Я попробую это, спасибо. Возможно, необходимо объединить это с добавлением события делегата в раковину и добавить его в конец теста, чтобы проверить, прошел ли журнал: testSink.ShouldRaise («ResponseReceived») .WithSender (testSink); – Nixit