public void ConsumerExceptionTest()
        {
            var cancellationTokenSource = new CancellationTokenSource();
            var locker = new object();

            var model = new Mock <IModel>();

            model.Setup(x => x.QueueDeclare(It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <IDictionary <string, object> >()))
            .Returns(new QueueDeclareOk(ModelBuilder.GetQueueName <TestDataContract>(null), 0, 0));
            model.Setup(x => x.BasicQos(It.IsAny <uint>(), It.IsAny <ushort>(), It.IsAny <bool>()));
            model.Setup(x => x.BasicReject(It.IsAny <ulong>(), It.IsAny <bool>()));

            var connection = new Mock <IConnection>();

            connection.Setup(x => x.CreateModel()).Returns(model.Object);

            var connectionManager = new Mock <IRabbitMqConnectionManager>();

            connectionManager.Setup(x => x.GetConnection()).Returns(connection.Object);

            var logger = new Mock <ILogger>();

            logger.Setup(x => x.Error(It.IsAny <Exception>(), It.IsAny <string>()));
            logger.Setup(x => x.Info(It.IsAny <string>()));

            var serializer = new Mock <ISerializer <TestDataContract> >();

            serializer.Setup(x => x.Serialize(It.IsAny <TestDataContract>())).Returns(new ReadOnlyMemory <byte>());
            serializer.Setup(x => x.Deserialize(It.IsAny <ReadOnlyMemory <byte> >())).Returns(new TestDataContract());

            Task procMessage(TestDataContract dc, CancellationToken c) => Task.Factory.StartNew(() => { });

            var consumer = new TestRabbitMqConsumer(connectionManager.Object, logger.Object, serializer.Object, procMessage);

            var container = new Mock <IWindsorContainer>();

            container.Setup(x => x.Resolve <IAutorepairConsumer>()).Returns(consumer);
            container.Setup(x => x.Release(It.IsAny <IAutorepairConsumer>()));

            var consumers = new AutorepairConsumers <IAutorepairConsumer>(container.Object.Resolve <IAutorepairConsumer>, container.Object.Release, cancellationTokenSource.Token);

            consumers.Start(new AutorepairConsumersConfig {
                ConsumersCountLimit = 1
            });

            Task.Delay(1500).Wait();

            container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(1));

            var basicConsumers = (IEnumerable)consumer.GetType().BaseType
                                 .GetField("_basicConsumers", BindingFlags.Instance | BindingFlags.NonPublic)
                                 .GetValue(consumer);
            var enumerator = basicConsumers.GetEnumerator();

            while (enumerator.MoveNext())
            {
                ((AsyncDefaultBasicConsumer)enumerator.Current).OnCancel().Wait();
            }

            Task.Delay(1000).Wait();

            container.Verify(x => x.Release(consumer), Times.Exactly(1));
            container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(2));
        }
        public void ConsumerExceptionTest()
        {
            var cancellationTokenSource = new CancellationTokenSource();
            var locker = new object();

            var queueName = ModelBuilder.GetQueueName <TestDataContract>(null);

            var processor = new Mock <ServiceBusProcessor>();

            processor.Setup(x => x.StartProcessingAsync(It.IsAny <CancellationToken>())).Returns(Task.Factory.StartNew(() => { }));
            processor.Setup(x => x.StopProcessingAsync(It.IsAny <CancellationToken>())).Returns(Task.Factory.StartNew(() => { }));

            var client = new Mock <ServiceBusClient>();

            client.Setup(x => x.CreateProcessor(queueName, It.IsAny <ServiceBusProcessorOptions>())).Returns(processor.Object);

            var connectionManager = new Mock <IAzureServiceBusConnectionManager>();

            connectionManager.Setup(x => x.GetClient()).Returns(client.Object);

            var logger = new Mock <ILogger>();

            logger.Setup(x => x.Error(It.IsAny <Exception>(), It.IsAny <string>()));
            logger.Setup(x => x.Info(It.IsAny <string>()));

            var serializer = new Mock <ISerializer <TestDataContract> >();

            serializer.Setup(x => x.Serialize(It.IsAny <TestDataContract>())).Returns(new ReadOnlyMemory <byte>());
            serializer.Setup(x => x.Deserialize(It.IsAny <ReadOnlyMemory <byte> >())).Returns(new TestDataContract());

            Task procMessage(TestDataContract dc, CancellationToken c) => Task.Factory.StartNew(() => { });

            var consumer = new TestRabbitMqConsumer(connectionManager.Object, logger.Object, serializer.Object, procMessage);

            var container = new Mock <IWindsorContainer>();

            container.Setup(x => x.Resolve <IAutorepairConsumer>()).Returns(consumer);
            container.Setup(x => x.Release(It.IsAny <IAutorepairConsumer>()));

            var consumers = new AutorepairConsumers <IAutorepairConsumer>(container.Object.Resolve <IAutorepairConsumer>, container.Object.Release, cancellationTokenSource.Token);

            consumers.Start(new AutorepairConsumersConfig {
                ConsumersCountLimit = 1
            });

            Task.Delay(1500).Wait();

            container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(1));

            var basicConsumers = (IEnumerable)consumer.GetType().BaseType
                                 .GetField("_basicConsumers", BindingFlags.Instance | BindingFlags.NonPublic)
                                 .GetValue(consumer);
            var enumerator = basicConsumers.GetEnumerator();

            while (enumerator.MoveNext())
            {
                ((AzureServiceBusBaseConsumer <TestDataContract> .BasicConsumer)enumerator.Current).Stop(true).Wait();
            }

            Task.Delay(1000).Wait();

            container.Verify(x => x.Release(consumer), Times.Exactly(1));
            container.Verify(x => x.Resolve <IAutorepairConsumer>(), Times.Exactly(2));
        }