public void TestQueueReaderWithMockMsmqWithNoConsumer()
        {
            var actualMessage = new Message1 {
                CorrelationId = "f3e608d4-96cf-4093-9923-91b13f4b7555"
            };
            var messageQueueMock = new Mock <IMessageQueue>();
            var messageMock      = new MessageQueueMessageWrapper(new Message {
                Body = actualMessage
            });

            messageQueueMock.Setup(m => m.EndReceive(It.IsAny <IAsyncResult>())).Returns(messageMock);
            var beginReceiveCalled = false;

            messageQueueMock.Setup(m => m.BeginReceive(It.IsAny <TimeSpan>()))
            .Callback(
                () =>
            {
                if (beginReceiveCalled)
                {
                    throw CreateMessageQueueException();
                }
                beginReceiveCalled = true;
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });

            var receiverReader = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body);

            receiverReader.Start();

            messageQueueMock.Verify(m => m.BeginReceive(It.IsAny <TimeSpan>()), Times.Exactly(1));
        }
        public void TestQueueReaderWithMockMsmqEndReceiveOneRetry()
        {
            var actualMessage = new Message1 {
                CorrelationId = "f3e608d4-96cf-4093-9923-91b13f4b7555"
            };
            var messageQueueMock = new Mock <IMessageQueue>();
            var messageMock      = new MessageQueueMessageWrapper(new Message {
                Body = actualMessage
            });

            var throwCount = 0;

            messageQueueMock
            .Setup(m => m.EndReceive(It.IsAny <IAsyncResult>()))
            .Returns(() => messageMock)
            .Callback(() =>
            {
                throwCount++;
                if (throwCount == 2)
                {
                    throw CreateMessageQueueException((int)MessageQueueErrorCode.IOTimeout);
                }
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });
            bool beginReceiveCalled = false;

            messageQueueMock.Setup(m => m.BeginReceive(It.IsAny <TimeSpan>()))
            .Callback(
                () =>
            {
                if (beginReceiveCalled)
                {
                    throw CreateMessageQueueException();
                }
                beginReceiveCalled = true;
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });

            Message1 message = null;

            using (var receiverReader = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body))
            {
                receiverReader.AttachConsumer(new ActionConsumer <Message1>(m =>
                {
                    message = m;
                    receiverReader.Dispose();
                }));
                receiverReader.Start();
                Assert.IsNotNull(message);
                Assert.AreEqual("f3e608d4-96cf-4093-9923-91b13f4b7555", message.CorrelationId);
                messageQueueMock.Verify(m => m.BeginReceive(It.IsAny <TimeSpan>()), Times.Exactly(2));
            }
        }