public async Task Should_call_onFallback_with_the_passed_context_when_execute_and_capture()
        {
            Func <Context, CancellationToken, Task <ResultPrimitive> > fallbackAction = (_, __) => Task.FromResult(ResultPrimitive.Substitute);

            IDictionary <string, object> contextData = null;

            Func <DelegateResult <ResultPrimitive>, Context, Task> onFallbackAsync = (ex, ctx) => { contextData = ctx; return(TaskHelper.EmptyTask); };

            FallbackPolicy <ResultPrimitive> fallbackPolicy = Policy
                                                              .HandleResult(ResultPrimitive.Fault)
                                                              .FallbackAsync(fallbackAction, onFallbackAsync);

            (await fallbackPolicy.ExecuteAndCaptureAsync(() => { return(Task.FromResult(ResultPrimitive.Fault)); },
                                                         new { key1 = "value1", key2 = "value2" }.AsDictionary()).ConfigureAwait(false))
            .Result.Should().Be(ResultPrimitive.Substitute);

            contextData.Should()
            .ContainKeys("key1", "key2").And
            .ContainValues("value1", "value2");
        }
        public async Task Should_call_fallbackAction_with_the_fault_when_execute_and_capture()
        {
            DelegateResult <ResultPrimitive> fallbackOutcome = null;

            Func <DelegateResult <ResultPrimitive>, Context, CancellationToken, Task <ResultPrimitive> > fallbackAction =
                (outcome, ctx, ct) => { fallbackOutcome = outcome; return(Task.FromResult(ResultPrimitive.Substitute)); };

            Func <DelegateResult <ResultPrimitive>, Context, Task> onFallback = (ex, ctx) => { return(TaskHelper.EmptyTask); };

            FallbackPolicy <ResultPrimitive> fallbackPolicy = Policy <ResultPrimitive>
                                                              .HandleResult(ResultPrimitive.Fault)
                                                              .FallbackAsync(fallbackAction, onFallback);

            var result = await fallbackPolicy.ExecuteAndCaptureAsync(() => { return(Task.FromResult(ResultPrimitive.Fault)); });

            result.Should().NotBeNull();
            result.Result.Should().Be(ResultPrimitive.Substitute);

            fallbackOutcome.Should().NotBeNull();
            fallbackOutcome.Exception.Should().BeNull();
            fallbackOutcome.Result.Should().Be(ResultPrimitive.Fault);
        }