public void DequeueReturnsMessageTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();

            var queueName = Guid.NewGuid().ToString();

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);
            conn.IsOpen.Returns(true);
            model.IsClosed.Returns(false);
            model.QueueDeclare(null, false, false, false, null).ReturnsForAnyArgs(new QueueDeclareOk(queueName, 1, 0));
            model.QueueDeclarePassive(null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 1, 0));
            model.MessageCount(null).ReturnsForAnyArgs(x => 1u);

            var payload = Guid.NewGuid().ToByteArray();
            var result = new BasicGetResult(0, false, null, null, 0, null, payload);
            model.BasicGet(queueName, false).Returns(result);

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = connFactory,
                Exchange = Constants.DefaultExchange,
                QueueName = queueName,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions(),
            };
            using (var rdr = new RabbitMQReader(setup, false))
            {
                var msg = rdr.Dequeue(TimeSpan.FromSeconds(30), CancellationToken.None);
                Assert.Equal(payload, msg.Body.CopyToByteArray());
            }
        }
        public void DequeueThrowsWhenDisposedTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();
            var throttler = Substitute.For<IDequeueThrottler>();
            var throttlerFactory = Substitute.For<IDequeueThrottlerFactory>();
            throttlerFactory.Create(null, null).ReturnsForAnyArgs(throttler);

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);
            model.QueueDeclare(null, false, false, false, null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 0, 0));
            model.QueueDeclarePassive(null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 1, 0));

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = connFactory,
                Exchange = null,
                QueueName = null,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions { DequeueThrottlerFactory = throttlerFactory },
            };
            using (var rdr = new RabbitMQReader(setup, false))
            {
                throttler.WhenForAnyArgs(x => x.Throttle(0, 0, CancellationToken.None)).Do(x =>
                {
                    ThreadPool.QueueUserWorkItem(state =>
                    {
                        try
                        {
                            rdr.Dispose();
                        }
                        catch { }
                    });
                });
                Exception error = null;
                try
                {
                    rdr.Dequeue(TimeSpan.FromSeconds(90), CancellationToken.None);
                }
                catch (ObjectDisposedException e)
                {
                    error = e;
                }
                Assert.NotNull(error);
            }
        }