Jeer
@Jeer
уверенный пользователь

Можно ли подменить экземпляр сервиса в DI?

Всем привет,
У меня есть какой-то хостед сервис 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;

Сейчас ошибка, что сервис не найден
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
Jeer
@Jeer Автор вопроса
уверенный пользователь
Я разобрался, регистрирую же по интерфейсу, доставать тоже нужно по интерфейсу и кастить
var logger = _servicesProvider.GetRequiredService<ILogger<ConsumerHostedService<Entity>>() as FakeConsumerHostedServiceLogger;
var msgs = logger.messages;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Тебе нужно ещё отдельно зарегистрировать
FakeConsumerHostedServiceLogger
Как самого себя
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы