2014-05-02 60 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

相關問題