public async void PublishDirectEventAsync_MessageMustBeSerializedAndCorrectlyRouted(bool persistant, byte deliveryMode)
        {
            //prepare

            var mockBus = new Mock <IAdvancedBus>();

            var mockExchange = new Mock <IExchange>();

            var mockModelNamingConventionController = new Mock <IModelNamingConventionController>();

            var subscriberName = "subscriber";
            var routingKey     = string.Concat("direct.", subscriberName);;

            IExchange         actualExchange   = null;
            string            actualRouting    = string.Empty;
            bool              actualMandatory  = true;
            MessageProperties actualProperties = null;

            byte[] actualMsg = null;

            mockModelNamingConventionController.Setup(x => x.GetDirectRoutingKey(subscriberName)).Returns(routingKey);

            mockBus.Setup(x => x.PublishAsync(mockExchange.Object, routingKey, false,
                                              It.IsAny <MessageProperties>(), It.IsAny <byte[]>()))
            .Returns((IExchange exchange, string routing, bool mandatory,
                      MessageProperties properties, byte[] msg) =>
                     { return(Task.FromResult(true)); })
            .Callback <IExchange, string, bool, MessageProperties, byte[]>(
                (exchange, routing, mandatory, properties, msg) =>
            {
                actualExchange   = exchange;
                actualRouting    = routing;
                actualMandatory  = mandatory;
                actualProperties = properties;
                actualMsg        = msg;
            });

            mockBus.Setup(x => x.ExchangeDeclareAsync("exchangename", ExchangeType.Topic,
                                                      false, true, false, false, null, false))
            .Returns((string exchangename, string exchanegType,
                      bool passive, bool durable, bool autoDelete, bool internalflag,
                      string alternateExchange, bool delayed) =>
                     { return(Task.FromResult(mockExchange.Object)); });

            //act
            EasyNetQPublisher easyNetQPublisher =
                new EasyNetQPublisher(mockBus.Object, "exchangename", mockModelNamingConventionController.Object);

            BookingCreated bookingCreated =
                new BookingCreated()
            {
                BookingName = string.Concat("Microsoft Sale",
                                            Guid.NewGuid().ToString())
            };

            var bookingCreatedIntegrationEvent = new IntegrationEvent <BookingCreated>()
            {
                Content   = bookingCreated,
                EventType = "bookingcreated"
            };
            await easyNetQPublisher.PublishDirectEventAsync(bookingCreatedIntegrationEvent,
                                                            subscriberName, persistant);



            //check
            actualExchange.Should().Be(mockExchange.Object);
            actualRouting.Should().Be(routingKey);
            actualMandatory.Should().Be(false);
            actualProperties.ShouldBeEquivalentTo(new MessageProperties()
            {
                DeliveryMode = deliveryMode
            });
            var messagejson  = JsonConvert.SerializeObject(bookingCreatedIntegrationEvent);
            var messagebytes = Encoding.UTF8.GetBytes(messagejson);

            actualMsg.ShouldBeEquivalentTo(messagebytes);
        }