2014-05-02 62 views
19

我有单元测试我的WEB API控制器的问题,我使用moq来模拟我的存储库,做它的设置和响应。然后用模拟的存储库启动控制器。问题是,当我尝试执行从控制装置的呼叫我得到一个异常:访问方法'System.Web.Http.HttpConfiguration.DefaultFormatters()'失败

尝试通过方法 “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()

说实话,不知道这里有什么问题。有没有人有一个想法在这里可能是什么问题?

控制器:

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>(); 
     } 
    } 
} 

单元测试:

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; 
     } 
    } 
} 
+0

我有相同的问题。你有没有研究过这里发生的事情? –

+0

@Ev解决了这个问题,但更新了项目中的所有库。 – Avangar

回答

14

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

我的应用程序没有工作,因为我删除了其他原因。

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

安装,包装Microsoft.AspNet.WebApi.Client

+5

虽然我不能确定我认为你是对的,但是当我用nuget更新我的项目中的所有软件包时,我的问题确实解决了。 – Avangar

+5

在我的情况下,这是Microsoft.AspNet.WebApi.Client和Microsoft.AspNet.WebApi.Core版本之间的差异,我试着更新两个和瞧。 – Marcus

相关问题