Что утверждать или проверять при модульном тестировании BackgroundService в ядре. Net - PullRequest
1 голос
/ 25 февраля 2020

У меня есть связанный вопрос здесь . Я прочитал this и пытаюсь смоделировать зависимости в моей размещенной службе. Но я запутался, чтобы утверждать или проверять что. Я думаю, чтобы убедиться, что StartConsumption на Mock Kafka Topic Consumer Manager вызывается. Но чтобы установить его, он возвращает void. Я не могу определить, как настроить предикат для макета.

services.AddSingleton(Mock.Of<IKafkaTopicConsumerManager>(_ => 
    _.StartConsumption(
       It.IsAny<CancellationToken>(),
       It.IsAny<IMessageProcessingCapable>(),
       It.IsAny<string>(),
       It.IsAny<string>(),
       It.IsAny<List<string>>(),
       It.IsAny<string>(),
       It.IsAny<int>())==void
    ));

Но при void он показывает недопустимый термин выражения. Ниже мой Worker.cs, который является Hosted Service.

protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
    _consumerManager.StartConsumption(
            cancellationToken,
            _messageProcessor,
            _config.GetSection("Kafka:Servers").Get<string>(),
            _config.GetSection("ConsumerGroup").Get<string>(),
            _config.GetSection("Topics").Get<List<string>>(),
            _config.GetSection("Kafka:TopicSuffix").Get<string>(),
            _config.GetSection("ConsumerThreads").Get<int>());
}

1 Ответ

0 голосов
/ 25 февраля 2020

Просто добавьте макет. Поскольку вызываемый член недействителен, возвращать нечего. Таким образом, нет необходимости настраивать его на выполнение каких-либо действий.

services.AddSingleton(Mock.Of<IKafkaTopicConsumerManage>());

То, что вы можете сделать, - это убедиться, что имитированный элемент был вызван после тренировки испытуемого объекта

var _mockedKafkaTopicConsumerManager = Mock.Get(serviceProvider.GetService<IKafkaTopicConsumerManage>());
_mockedKafkaTopicConsumerManager
    .Verify(c => c.StartConsumption(
        It.IsAny<CancellationToken>(), 
        _mockedMessageProcessor.Object,
        It.IsAny<string>(),
        It.IsAny<string>(),
        It.IsAny<List<string>>(),
        It.IsAny<string>(),
        It.IsAny<int>()
),Times.Once);
...