Больше Никаких Моков ILogger'a
Имитация зависимостей в процессе разработки может быть сложной задачей, особенно если вы не являетесь владельцем интерфейса, а взаимодействие с интерфейсом в коде осуществляется через методы расширения. Так происходит с ILogger из базового пакета Microsoft. Интерфейс ILogger относительно прост, однако вы редко взаимодействуете с ним напрямую. Как же проверить, что был вызван правильный метод и параметры, чтобы гарантировать корректность ведения журнала?
Можно использовать мок ILogger<> с помощью Moq и внедрить его в тестируемую систему, а затем проверять, вызывается ли он. Однако это может быть затруднительно, и также потребуется копировать код проверки мока. Это неидеально.
FakeLogger предоставляет полный доступ ко всем данным, которые вызываются при использовании ILogger в коде, и позволяет проверять их значения в тестах.
Начало работы
С момента создания он немного изменился. Сейчас его можно найти в пакете Microsoft.Extensions.Diagnostics.Testing. После добавления NuGet-пакета, его можно использовать в модульных тестах. Рассмотрим простой сервис в качестве тестируемой системы:
public class DemoService(ILogger<DemoService> logger)
{
public void LogMe()
{
logger.LogInformation("Пишем в лог.");
}
}
В сервисе выше мы хотим проверить, что при выполнении метода LogMe вызывается соответствующий метод логирования.
Начнём с создания экземпляра тестируемой системы, а для этого необходимо создать экземпляр FakeLogger:
var fakeLogger = new FakeLogger<DemoService>();
var sut = new DemoService(fakeLogger);
Т.к. FakeLogger<> реализует нужный интерфейс, мы можем использовать его для создания нашего DemoService.
После выполнения блока Act https://t.me/NetDeveloperDiary/1003 теста мы можем проверить результаты:
fakeLogger
.LatestRecord
.Message
.Should()
.Be("Пишем в лог.");
Самый простой способ сделать это — посмотреть свойство LatestRecord. Это выведет последний вызов экземпляра логгера в тестируемой системе, и это всё, что нужно для базового использования!
Итого
FakeLogger удобно использовать при тестировании системы, требующей реализации ILogger. Он позволяет тестировать корректные уровни логирования, сообщения и структурированные данные, указанные в системных сообщениях логгера.
Источник: https://adamstorr.co.uk/blog/no-more-mocking-ilogger/