2014-05-02 1 views
19

J'ai un problème avec l'unité de tester mon contrôleur API Web, j'utilise moq pour maquiller mon référentiel, faire la configuration et la réponse pour cela. Puis initier le contrôleur avec un référentiel simulé. Le problème est lorsque je tente d'exécuter un appel du contrôleur je reçois une exception:méthode d'accès 'System.Web.Http.HttpConfiguration.DefaultFormatters()' a échoué

tentative par la méthode « System.Web.Http.HttpConfiguration..ctor (System.Web.Http.HttpRouteCollection) » pour accéder à la méthode 'System.Web.Http.HttpConfiguration.DefaultFormatters()' a échoué.


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

Pour être honnête, ne pas avoir une idée de ce qui pourrait être le problème ici. Est-ce que quelqu'un a une idée de ce qui pourrait être le problème ici?

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

test unitaire:

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

J'ai exactement le même problème. Avez-vous déjà travaillé sur ce qui s'est passé ici? –

+0

@Ev Résolution du problème, mais mise à jour de toutes les bibliothèques du projet. – Avangar

Répondre

14

Essayez assurer que Microsoft.AspNet.WebApi.Client est installé.

Mon application ne fonctionnait pas parce que j'avais supprimé cela pour d'autres raisons.

Ouvrir Package Manager Console et exécuter:

Install-Package Microsoft.AspNet.WebApi.Client

+5

Bien que je ne puisse être sûr que vous ayez raison, mon problème a été résolu lorsque j'ai mis à jour tous les paquets de mon projet avec nuget. – Avangar

+5

Dans mon cas, il était un écart entre les versions de Microsoft.AspNet.WebApi.Client et Microsoft.AspNet.WebApi.Core, j'ai essayé de mettre à jour les deux et le tour est joué. – Marcus

Questions connexes