public async Task ProcessRequestAsync_IfExceptionIsNotHttpResponseException_DisposesRequest()
        {
            // Arrange
            using (HttpRequestMessage request = CreateRequest())
                using (SpyDisposable spy = new SpyDisposable())
                {
                    request.RegisterForDispose(spy);

                    ExceptionDispatchInfo   exceptionInfo = CreateExceptionInfo(CreateException());
                    Mock <IExceptionLogger> loggerMock    = new Mock <IExceptionLogger>(MockBehavior.Strict);
                    loggerMock
                    .Setup(l => l.LogAsync(It.IsAny <ExceptionLoggerContext>(), It.IsAny <CancellationToken>()))
                    .Returns(Task.FromResult(0));
                    Mock <IExceptionHandler> handlerMock = new Mock <IExceptionHandler>(MockBehavior.Strict);
                    handlerMock
                    .Setup(h => h.HandleAsync(It.IsAny <ExceptionHandlerContext>(), It.IsAny <CancellationToken>()))
                    .Returns(Task.FromResult(0));

                    HttpRouteExceptionHandler product = CreateProductUnderTest(exceptionInfo, loggerMock.Object, handlerMock.Object);

                    Mock <HttpResponseBase> responseBaseMock = new Mock <HttpResponseBase>();
                    responseBaseMock.SetupGet(r => r.Cache).Returns(() => new Mock <HttpCachePolicyBase>().Object);
                    HttpResponseBase responseBase = responseBaseMock.Object;
                    HttpContextBase  contextBase  = CreateStubContextBase(responseBase);
                    contextBase.SetHttpRequestMessage(request);

                    // Act & Assert
                    await Assert.ThrowsAsync <Exception>(() => product.ProcessRequestAsync(contextBase));

                    Assert.True(spy.Disposed);
                    Assert.ThrowsObjectDisposed(() => request.Method = HttpMethod.Get,
                                                typeof(HttpRequestMessage).FullName);
                }
        }
        public void ProcessRequestAsync_IfExceptionIsNotHttpResponseException_DisposesRequest()
        {
            // Arrange
            using (HttpRequestMessage request = CreateRequest())
                using (SpyDisposable spy = new SpyDisposable())
                {
                    request.RegisterForDispose(spy);

                    ExceptionDispatchInfo exceptionInfo = CreateExceptionInfo(CreateException());
                    IExceptionLogger      logger        = CreateDummyLogger();
                    IExceptionHandler     handler       = CreateDummyHandler();

                    HttpRouteExceptionHandler product = CreateProductUnderTest(exceptionInfo, logger, handler);

                    Mock <HttpResponseBase> responseBaseMock = new Mock <HttpResponseBase>();
                    responseBaseMock.SetupGet(r => r.Cache).Returns(() => new Mock <HttpCachePolicyBase>().Object);
                    HttpResponseBase responseBase = responseBaseMock.Object;
                    HttpContextBase  contextBase  = CreateStubContextBase(responseBase);
                    contextBase.SetHttpRequestMessage(request);

                    // Act
                    Task task = product.ProcessRequestAsync(contextBase);

                    // Assert
                    Assert.NotNull(task);
                    task.WaitUntilCompleted();
                    Assert.Equal(TaskStatus.Faulted, task.Status);

                    Assert.True(spy.Disposed);
                    Assert.ThrowsObjectDisposed(() => request.Method = HttpMethod.Get,
                                                typeof(HttpRequestMessage).FullName);
                }
        }
        public async Task ProcessRequestAsync_IfExceptionIsHttpResponseException_DisposesRequestAndResponse()
        {
            // Arrange
            using (HttpResponseMessage response = CreateResponse())
                using (HttpRequestMessage request = CreateRequest())
                    using (SpyDisposable spy = new SpyDisposable())
                    {
                        request.RegisterForDispose(spy);

                        ExceptionDispatchInfo exceptionInfo = CreateExceptionInfo(new HttpResponseException(response));
                        IExceptionLogger      logger        = CreateDummyLogger();
                        IExceptionHandler     handler       = CreateDummyHandler();

                        HttpRouteExceptionHandler product = CreateProductUnderTest(exceptionInfo, logger, handler);

                        Mock <HttpResponseBase> responseBaseMock = new Mock <HttpResponseBase>();
                        responseBaseMock.SetupGet(r => r.Cache).Returns(() => new Mock <HttpCachePolicyBase>().Object);
                        HttpResponseBase responseBase = responseBaseMock.Object;
                        HttpContextBase  contextBase  = CreateStubContextBase(responseBase);
                        contextBase.SetHttpRequestMessage(request);

                        // Act
                        await product.ProcessRequestAsync(contextBase);

                        // Assert
                        Assert.True(spy.Disposed);
                        Assert.ThrowsObjectDisposed(() => request.Method = HttpMethod.Get,
                                                    typeof(HttpRequestMessage).FullName);
                        Assert.ThrowsObjectDisposed(() => response.StatusCode = HttpStatusCode.OK,
                                                    typeof(HttpResponseMessage).FullName);
                    }
        }
        public void ProcessRequestAsync_IfExceptionIsNotHttpResponseException_DisposesRequest()
        {
            // Arrange
            using (HttpRequestMessage request = CreateRequest())
            using (SpyDisposable spy = new SpyDisposable())
            {
                request.RegisterForDispose(spy);

                ExceptionDispatchInfo exceptionInfo = CreateExceptionInfo(CreateException());
                IExceptionLogger logger = CreateDummyLogger();
                IExceptionHandler handler = CreateDummyHandler();

                HttpRouteExceptionHandler product = CreateProductUnderTest(exceptionInfo, logger, handler);

                Mock<HttpResponseBase> responseBaseMock = new Mock<HttpResponseBase>();
                responseBaseMock.SetupGet(r => r.Cache).Returns(() => new Mock<HttpCachePolicyBase>().Object);
                HttpResponseBase responseBase = responseBaseMock.Object;
                HttpContextBase contextBase = CreateStubContextBase(responseBase);
                contextBase.SetHttpRequestMessage(request);

                // Act
                Task task = product.ProcessRequestAsync(contextBase);

                // Assert
                Assert.NotNull(task);
                task.WaitUntilCompleted();
                Assert.Equal(TaskStatus.Faulted, task.Status);

                Assert.True(spy.Disposed);
                Assert.ThrowsObjectDisposed(() => request.Method = HttpMethod.Get,
                    typeof(HttpRequestMessage).FullName);
            }
        }