public void Dispatch_BuildGenericType_ExecutesAllHandlersPassingTheEvent(
            [Frozen] Mock<IContainer> container,
            Mock<IDomainEventHandler<FakeDomainEvent>> eventHandler1,
            Mock<IDomainEventHandler<FakeDomainEvent>> eventHandler2,
            FakeDomainEvent domainEvent,
            DomainEventDispatcher dispatcher)
        {
            // Arrange

            var genericTypeName = typeof (IDomainEventHandler<FakeDomainEvent>).FullName;

            var eventHandlers = new List<IDomainEventHandler<FakeDomainEvent>>
            {
                eventHandler1.Object,
                eventHandler2.Object
            };

            container.Setup(c => c.GetAllInstances(It.Is<Type>(t => t.FullName == genericTypeName)))
                     .Returns(eventHandlers);

            // Act

            dispatcher.Dispatch(domainEvent);

            // Assert

            eventHandler1.Verify(t => t.Handle(domainEvent), Times.Once);

            eventHandler2.Verify(t => t.Handle(domainEvent), Times.Once);
        }
        public void Dispatch_EventHandler1ThrowsException_ExecutionStopsAndRethrow(
            [Frozen] Mock<IContainer> container,
            Mock<IDomainEventHandler<FakeDomainEvent>> eventHandler1,
            Mock<IDomainEventHandler<FakeDomainEvent>> eventHandler2,
            FakeDomainEvent domainEvent,
            DomainEventDispatcher dispatcher)
        {
            // Arrange

            var genericTypeName = typeof (IDomainEventHandler<FakeDomainEvent>).FullName;

            var eventHandlers = new List<IDomainEventHandler<FakeDomainEvent>>
            {
                eventHandler1.Object,
                eventHandler2.Object
            };

            container.Setup(c => c.GetAllInstances(It.Is<Type>(t => t.FullName == genericTypeName)))
                     .Returns(eventHandlers);

            eventHandler1.Setup(h => h.Handle(It.IsAny<FakeDomainEvent>())).Throws<Exception>();

            // Act

            Assert.Throws<Exception>(() => dispatcher.Dispatch(domainEvent));

            // Assert

            eventHandler1.Verify(t => t.Handle(domainEvent), Times.Once);

            eventHandler2.Verify(t => t.Handle(domainEvent), Times.Never);
        }
        public void Dispatch_NoHandlersRegistered_DoNothing(
            [Frozen] Mock<IContainer> container,
            FakeDomainEvent domainEvent,
            DomainEventDispatcher dispatcher)
        {
            // Arrange

            var genericTypeName = typeof (IDomainEventHandler<FakeDomainEvent>).FullName;

            container.Setup(c => c.GetAllInstances(It.Is<Type>(t => t.FullName == genericTypeName)))
                     .Returns(new List<IDomainEventHandler<FakeDomainEvent>>());

            // Act

            dispatcher.Dispatch(domainEvent);
        }
 public void Dispatch_NullEvent_ThrowsArgumentNullException(DomainEventDispatcher dispatcher)
 {
     Assert.Throws<ArgumentNullException>(() => dispatcher.Dispatch(null));
 }