public void WhenValidationFails_ThenThrows_DoesNotCallDecoratedCommandHandler()
        {
            var validator = A.Fake <IValidator <object> >();

            A.CallTo(() => validator.Validate(A <object> ._)).Returns(new ValidationResult(new[] { new ValidationFailure("MyProperty", "Some error") }));

            var decoratedHandler = A.Fake <IQueryHandler <object, object> >();

            var sut = new ValidationAwareQueryHandler <object, object>(validator, decoratedHandler);

            var query = new object();

            AssertEx.TaskThrows <ValidationException>(() => sut.Handle(query));

            A.CallTo(() => validator.Validate(query)).MustHaveHappened();
            A.CallTo(() => decoratedHandler.Handle(A <object> ._)).MustNotHaveHappened();
        }
        public void Handle_ValidatesFirst_ThenPassesControlToDecoratedCommandHandler()
        {
            var validator = A.Fake <IValidator <object> >();

            A.CallTo(() => validator.Validate(A <object> ._)).Returns(new ValidationResult(new ValidationFailure[0]));

            var decoratedHandler = A.Fake <IQueryHandler <object, object> >();
            var expected         = new object();

            A.CallTo(() => decoratedHandler.Handle(A <object> ._)).Returns(expected);

            var sut = new ValidationAwareQueryHandler <object, object>(validator, decoratedHandler);

            var query  = new object();
            var actual = sut.Handle(query).Result;

            Assert.That(actual, Is.EqualTo(expected));
            A.CallTo(() => validator.Validate(query)).MustHaveHappened();
            A.CallTo(() => decoratedHandler.Handle(query)).MustHaveHappened();
        }