2014-05-02 14 views
19

Ho riscontrato problemi con il test delle unità del mio controller API WEB, sto utilizzando moq per simulare il mio repository, eseguire l'installazione e la risposta per esso. Quindi avviare il controller con repository mocked. Il problema è quando provo ad eseguire una chiamata dal controller ottengo un'eccezione:metodo di accesso 'System.Web.Http.HttpConfiguration.DefaultFormatters()' fallito

Tentativo con il metodo 'System.Web.Http.HttpConfiguration..ctor (System.Web.Http.HttpRouteCollection)' per accedere al metodo 'System.Web.Http.HttpConfiguration.DefaultFormatters()' non riuscito.


a System.Web.Http.HttpConfiguration..ctor (HttpRouteCollection vie aeree) a System.Web.Http.HttpConfiguration..ctor() a EyeShield.Api.Tests.PersonsControllerTests.Get_Persons_ReturnsAllPersons()

Per essere onesti non ho idea di quale potrebbe essere il problema qui. Qualcuno ha un'idea di quale potrebbe essere il problema qui?

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

ho lo stesso identico problema. Hai mai capito cosa è successo qui? –

+0

@Ev Risolto il problema ma l'aggiornamento di tutte le librerie nel progetto. – Avangar

risposta

14

Prova assicurando che Microsoft.AspNet.WebApi.Client è installato.

La mia app non funzionava perché l'avevo rimossa per altri motivi.

Apri pacchetto Console Manager ed eseguire:

Installare-Pacchetto Microsoft.AspNet.WebApi.Client

+5

Anche se non posso essere sicuro di pensare che tu abbia ragione, il mio problema è stato risolto quando ho fatto l'aggiornamento di tutti i pacchetti nel mio progetto con nuget. – Avangar

+5

Nel mio caso è stata una discrepanza tra le versioni di Microsoft.AspNet.WebApi.Client e Microsoft.AspNet.WebApi.Core, ho provato ad aggiornare entrambi e voilà. – Marcus

Problemi correlati