private IServiceProvider CreateServices()
        {
            var services = new ServiceCollection();

            services
            .AddEntityFramework()
            .AddInMemoryDatabase();

            services.Add(new ServiceDescriptor(
                             typeof(ILoggerFactory),
                             NullLoggerFactory.Instance));

            services.AddMvc();

            // helper taken from
            // https://github.com/aspnet/Mvc/blob/514054a66db398171d25494d7c0494f134e8f80a/test/Microsoft.AspNet.Mvc.Core.Test/HttpOkObjectResultTest.cs
            // which contains the following setup for ObjectResult testing...

            services.Add(new ServiceDescriptor(
                             typeof(ILogger <ObjectResult>),
                             new Logger <ObjectResult>(NullLoggerFactory.Instance)));

            var optionsAccessor = new OptionsManager <MvcOptions>(Enumerable.Empty <IConfigureOptions <MvcOptions> >());

            optionsAccessor.Value.OutputFormatters.Add(new JsonOutputFormatter());
            services.Add(new ServiceDescriptor(typeof(IOptions <MvcOptions>), optionsAccessor));

            var bindingContext = new ActionBindingContext
            {
                OutputFormatters = optionsAccessor.Value.OutputFormatters,
            };

            var bindingContextAccessor = new ActionBindingContextAccessor
            {
                ActionBindingContext = bindingContext,
            };

            services.Add(new ServiceDescriptor(typeof(IActionBindingContextAccessor), bindingContextAccessor));

            var executor = new ObjectResultExecutor(optionsAccessor,
                                                    bindingContextAccessor,
                                                    new TestHttpResponseStreamWriterFactory(),
                                                    NullLoggerFactory.Instance);

            services.Add(new ServiceDescriptor(typeof(ObjectResultExecutor), executor));

            return(services.BuildServiceProvider());
        }
        private static ActionContext CreateMockActionContext(
            HttpResponse response = null,
            string requestAcceptHeader = "application/*",
            string requestContentType = "application/json",
            string requestAcceptCharsetHeader = "",
            bool respectBrowserAcceptHeader = false)
        {
            var httpContext = new Mock<HttpContext>();
            if (response != null)
            {
                httpContext.Setup(o => o.Response).Returns(response);
            }

            var content = "{name: 'Person Name', Age: 'not-an-age'}";
            var contentBytes = Encoding.UTF8.GetBytes(content);

            var request = new DefaultHttpContext().Request;
            request.Headers["Accept-Charset"] = requestAcceptCharsetHeader;
            request.Headers["Accept"] = requestAcceptHeader;
            request.ContentType = requestContentType;
            request.Body = new MemoryStream(contentBytes);

            httpContext.Setup(o => o.Request).Returns(request);
            httpContext.Setup(o => o.RequestServices).Returns(GetServiceProvider());
            var optionsAccessor = new TestOptionsManager<MvcOptions>();
            optionsAccessor.Value.OutputFormatters.Add(new StringOutputFormatter());
            optionsAccessor.Value.OutputFormatters.Add(new JsonOutputFormatter());
            optionsAccessor.Value.RespectBrowserAcceptHeader = respectBrowserAcceptHeader;
            var actionBindingContextAccessor = new ActionBindingContextAccessor()
            {
                ActionBindingContext = new ActionBindingContext()
                {
                    OutputFormatters = optionsAccessor.Value.OutputFormatters
                }
            };

            httpContext.Setup(o => o.RequestServices.GetService(typeof(IActionBindingContextAccessor)))
                       .Returns(actionBindingContextAccessor);
            httpContext.Setup(o => o.RequestServices.GetService(typeof(IOptions<MvcOptions>)))
                .Returns(optionsAccessor);
            httpContext.Setup(o => o.RequestServices.GetService(typeof(ILogger<ObjectResult>)))
                .Returns(new Mock<ILogger<ObjectResult>>().Object);

            return new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor());
        }