public void SingleAspect_If_ReturnCalled_InPipeline_Method_ShouldNot_BeCalled()
        {
            // Arrange
            var aspect   = new ReturnDefaultValueAspect(BoundaryType.Entry);
            var pipeline = CreatePipeline <IService>(
                new Service(), nameof(IService.Identity), Args.Pack(aspect), Args.Box(10));

            // Act
            _executor.ExecutePipeline(pipeline, pipeline.Invocation);

            // Assert

            InvocationAssert.ProceedNotCalled(pipeline.Invocation);

            Assert.Equal(new[]
            {
                new BoundaryState(BoundaryType.Entry)
            }, aspect.ExecutionStack);
        }
        public void MultipleAspects_OnEntry_ReturnResult_OnSuccess_NotCalled_OnTriggered_Aspect_But_On_OuterAspects()
        {
            // Arrange
            var afterBreaker1 = new ObservableAspect {
                InternalOrder = 3
            };
            var afterBreaker2 = new ObservableAspect {
                InternalOrder = 2
            };
            var breaker = new ReturnDefaultValueAspect(BoundaryType.Entry)
            {
                InternalOrder = 1
            };
            var beforeBreaker = new ObservableAspect {
                InternalOrder = 0
            };

            var pipeline = CreatePipeline <IService>(
                new Service(), nameof(IService.Identity),
                Args.Pack(beforeBreaker, breaker, afterBreaker1, afterBreaker2),
                Args.Box(10));

            // Act
            _executor.ExecutePipeline(pipeline, pipeline.Invocation);

            // Assert

            // Метод не вызвался, т.к. 2й аспект вернул результат
            InvocationAssert.ProceedNotCalled(pipeline.Invocation);
            // Первый аспект прошел весь нормальный флоу
            Assert.Equal(_normalExecutionStack, beforeBreaker.ExecutionStack);
            // Второй вернул результат и кроме OnEntry ничего не выполнилось
            Assert.Equal(new[]
            {
                new BoundaryState(BoundaryType.Entry)
            }, breaker.ExecutionStack);

            // Остальные не выполнились
            Assert.Empty(afterBreaker1.ExecutionStack);
            Assert.Empty(afterBreaker2.ExecutionStack);
        }