Всем привет,
У меня есть какой-то хостед сервис
ConsumerHostedService<Entity>
В него через конструктор внедрен логгер
ILogger<ConsumerHostedService<Entity>>
Могу ли я подменить какой-то фейковой реализацией этот логгер, чтобы проассертить в тестах какие-то сообщения?
Написать какую-то реализацию фейкового сервиса, вроде:
private class FakeConsumerHostedServiceLogger : ILogger<ConsumerHostedService<Entity>>
{
public List<FakeLoggerMessage> messages = new();
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
{
messages.Add(new FakeLoggerMessage(logLevel, eventId, exception));
}
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public IDisposable BeginScope<TState>(TState state)
{
throw new NotImplementedException();
}
public record FakeLoggerMessage(LogLevel logLevel, EventId eventId, Exception? exception);
}
А затем, когда готовятся тесты, у меня используется service provider, в него подсунуть по этому типу свою реализацию, вот примерно так:
_servicesProvider = new ServiceCollection()
.AddLogging()
.AddSingleton<ILogger<ConsumerHostedService<Entity>>, FakeConsumerHostedServiceLogger>()
/// вырезал для краткости
.BuildServiceProvider();
Потом в ассертах вытаскивать мой экземпляр, что-то типа такого
var logger = _servicesProvider.GetRequiredService<FakeConsumerHostedServiceLogger>();
var msgs = logger.messages;
Сейчас ошибка, что сервис не найден