访问方法“System.Web.Http.HttpConfiguration.DefaultFormatters()'失败 [英] access method 'System.Web.Http.HttpConfiguration.DefaultFormatters()' failed

查看:3335
本文介绍了访问方法“System.Web.Http.HttpConfiguration.DefaultFormatters()'失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有单元测试我的Web API控制器,​​我使用起订量来模仿我的仓库,做安装和响应它的问题。然后启动与嘲笑库控制器。问题是,当我尝试执行从控制器中呼叫我得到一个异常:


  

尝试用方法
  System.Web.Http.HttpConfiguration..ctor(System.Web.Http.HttpRouteCollection)'
  访问方法
  System.Web.Http.HttpConfiguration.DefaultFormatters()'失败。


  
  

  
  

在System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection
  路由)在System.Web.Http.HttpConfiguration..ctor()在
  EyeShield.Api.Tests.PersonsControllerTests.Get_Persons_ReturnsAllPersons()


说实话也没有一个想法可能是什么问题就在这里。做任何人有一个想法,什么可能是这里的问题?

控制器:

 使用系统;
使用System.Net;
使用System.Net.Http;
使用EyeShield.Api.DtoMappers;
使用EyeShield.Api.Models;
使用EyeShield.Service;
使用System.Web.Http;命名空间EyeShield.Api.Controllers
{
    公共类PersonsController:ApiController
    {
        私人只读IPersonService _personService;        公共PersonsController(IPersonService personService)
        {
            _personService = personService;
        }        公众的Htt presponseMessage的get()
        {
            尝试
            {
                变种人= PersonMapper.ToDto(_personService.GetPersons());
                VAR响应= Request.CreateResponse(的HTTPStatus code.OK,人);
                返回响应;
            }
            赶上(例外五)
            {
                返回Request.CreateErrorResponse(的HTTPStatus code.BadRequest,e.Message);
            }
        }
    }
}

Global.asax中:

 使用EyeShield.Data.Infrastructure;
使用EyeShield.Data.Repositories;
使用EyeShield.Service;
使用Ninject;
使用Ninject.Web.Common;
使用系统;
使用的System.Web;
使用System.Web.Http;
使用System.Web.Mvc;
使用System.Web.Routing;命名空间EyeShield.Api
{
    公共类MvcApplication:NinjectHttpApplication
    {
        保护覆盖无效OnApplicationStarted()
        {
            base.OnApplicationStarted();
            AreaRegistration.RegisterAllAreas();            WebApiConfig.Register(GlobalConfiguration.Configuration);
            WebApiConfig.ConfigureCamelCaseResponse(GlobalConfiguration.Configuration);            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }        保护覆盖的iKernel CreateKernel()
        {
            VAR内核=新StandardKernel();
            kernel.Bind<&Func键LT;的iKernel>方式>()ToMethod(CTX =>()=>新建引导程序()内核。);
            kernel.Bind&所述; IHttpModule的方式>()到< HttpApplicationInitializationHttpModule>();            RegisterServices(内核);            //安装我们基于Ninject-的IDependencyResolver到Web API配置
            GlobalConfiguration.Configuration.DependencyResolver =新NinjectDependencyResolver(内核);            返回内核;
        }        私人无效RegisterServices(内核的iKernel)
        {
            //这是我们告诉Ninject如何解决服务请求
            kernel.Bind&所述; IDatabaseFactory方式>()到< DatabaseFactory>();
            kernel.Bind&所述; IPersonService方式>()到< PersonService>();
            kernel.Bind&所述; IPersonRepository方式>()到< PersonRepository>();
        }
    }
}

单元测试:

 使用System.Collections.Generic;
使用EyeShield.Api.Controllers;
使用EyeShield.Api.DtoMappers;
使用EyeShield.Api.Models;
使用EyeShield.Service;
使用起订量;
使用NUnit.Framework;
使用System.Net;
使用System.Net.Http;
使用System.Web.Http;
使用System.Web.Http.Hosting;命名空间EyeShield.Api.Tests
{
    [的TestFixture]
    公共类PersonsControllerTests
    {
        私人模拟< IPersonService> _personService;        [建立]
        公共无效设置()
        {
            _personService =新的模拟< IPersonService>();
        }        [测试]
        公共无效Get_Persons_ReturnsAllPersons()
        {
            //安排
            变种fakePesons = GetPersonsContainers();            _personService.Setup(X => x.GetPersons())返回(PersonMapper.FromDto(fakePesons))。            //这里发生异常
            VAR控制器=新PersonsController(_personService.Object)
            {
                请求=新的Htt prequestMessage()
                {
                    属性= {{HttpPropertyKeys.HttpConfigurationKey,新HttpConfiguration()}}
                }
            };            //法案
            变种响应= controller.Get();
            字符串str = response.Content.ReadAsStringAsync()结果。            //断言
            Assert.AreEqual(的HTTPStatus code.OK,response.Status code);
        }        私有静态的IEnumerable< PersonContainer> GetPersonsContainers()
        {
            IEnumerable的< PersonContainer> fakePersons =新的List< PersonContainer>
                {
                    新PersonContainer {ID = 1,名称=洛克,姓氏=Lamora,PersonalId =QWE654789,位置=软件工程师},
                    新PersonContainer {ID = 2,名称=让姓=塔内,PersonalId =XYZ123456,位置=生物实验室助理},
                    新PersonContainer {ID = 3,名称=爱德华,姓氏=克劳利,PersonalId =ABC654789,位置=系统基础设施}
                };            返回fakePersons;
        }
    }
}


解决方案

尽量确保已安装Microsoft.AspNet.WebApi.Client。

我的应用程序是行不通的,因为我已经删除了其他原因。

打开包管理器控制台,然后执行:


  

安装封装Microsoft.AspNet.WebApi.Client


I have problem with unit testing my WEB API controller, I'm using moq to mock up my repository, do the setup and response for it. Then initiate the controller with mocked repository. The problem is when I try to execute a call from the controller I get an exception:

Attempt by method 'System.Web.Http.HttpConfiguration..ctor(System.Web.Http.HttpRouteCollection)' to access method 'System.Web.Http.HttpConfiguration.DefaultFormatters()' failed.


at System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection routes) at System.Web.Http.HttpConfiguration..ctor() at EyeShield.Api.Tests.PersonsControllerTests.Get_Persons_ReturnsAllPersons()

To be honest do don't have an idea what could be the problem here. Do anyone has an idea what might be the issue here?

Controller:

using System;
using System.Net;
using System.Net.Http;
using EyeShield.Api.DtoMappers;
using EyeShield.Api.Models;
using EyeShield.Service;
using System.Web.Http;

namespace EyeShield.Api.Controllers
{
    public class PersonsController : ApiController
    {
        private readonly IPersonService _personService;

        public PersonsController(IPersonService personService)
        {
            _personService = personService;
        }

        public HttpResponseMessage Get()
        {
            try
            {
                var persons = PersonMapper.ToDto(_personService.GetPersons());
                var response = Request.CreateResponse(HttpStatusCode.OK, persons);
                return response;
            }
            catch (Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, e.Message);
            }
        }
    }
}

Global.asax:

using EyeShield.Data.Infrastructure;
using EyeShield.Data.Repositories;
using EyeShield.Service;
using Ninject;
using Ninject.Web.Common;
using System;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;

namespace EyeShield.Api
{
    public class MvcApplication : NinjectHttpApplication
    {
        protected override void OnApplicationStarted()
        {
            base.OnApplicationStarted();
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            WebApiConfig.ConfigureCamelCaseResponse(GlobalConfiguration.Configuration);

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }

        protected override IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);

            // Install our Ninject-based IDependencyResolver into the Web API config
            GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

            return kernel;
        }

        private void RegisterServices(IKernel kernel)
        {
            // This is where we tell Ninject how to resolve service requests
            kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
            kernel.Bind<IPersonService>().To<PersonService>();
            kernel.Bind<IPersonRepository>().To<PersonRepository>();
        }
    }
}

Unit Test:

using System.Collections.Generic;
using EyeShield.Api.Controllers;
using EyeShield.Api.DtoMappers;
using EyeShield.Api.Models;
using EyeShield.Service;
using Moq;
using NUnit.Framework;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Hosting;

namespace EyeShield.Api.Tests
{
    [TestFixture]
    public class PersonsControllerTests
    {
        private Mock<IPersonService> _personService;

        [SetUp]
        public void SetUp()
        {
            _personService = new Mock<IPersonService>();
        }

        [Test]
        public void Get_Persons_ReturnsAllPersons()
        {
            // Arrange
            var fakePesons = GetPersonsContainers();

            _personService.Setup(x => x.GetPersons()).Returns(PersonMapper.FromDto(fakePesons));

            // here exception occurs
            var controller = new PersonsController(_personService.Object)
            {
                Request = new HttpRequestMessage()
                {
                    Properties = { { HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration() } }
                }
            };

            // Act
            var response = controller.Get();
            string str = response.Content.ReadAsStringAsync().Result;

            // Assert
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }

        private static IEnumerable<PersonContainer> GetPersonsContainers()
        {
            IEnumerable<PersonContainer> fakePersons = new List<PersonContainer>
                {
                    new PersonContainer {Id = 1, Name = "Loke", Surname = "Lamora", PersonalId = "QWE654789", Position = "Software Engineer"},
                    new PersonContainer {Id = 2, Name = "Jean", Surname = "Tannen", PersonalId = "XYZ123456", Position = "Biology Lab Assistant"},
                    new PersonContainer {Id = 3, Name = "Edward", Surname = "Crowley", PersonalId = "ABC654789", Position = "System Infrastructure"}
                };

            return fakePersons;
        }
    }
}

解决方案

Try ensuring that Microsoft.AspNet.WebApi.Client is installed.

My app wasn't working because I'd removed that for other reasons.

Open Package Manager Console and execute:

Install-Package Microsoft.AspNet.WebApi.Client

这篇关于访问方法“System.Web.Http.HttpConfiguration.DefaultFormatters()'失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆