2014-05-02 5 views
19

Ich habe Probleme mit der Einheit, die meinen WEB-API-Controller testet. Ich benutze moq, um mein Repository nachzubilden, die Einrichtung und die Antwort dafür. Dann initiiere den Controller mit dem mocked Repository. Das Problem ist, wenn ich versuche, einen Anruf von der Steuerung auszuführen erhalte ich eine Ausnahme:Zugriffsmethode 'System.Web.Http.HttpConfiguration.DefaultFormatters()' fehlgeschlagen

Versuch nach der Methode ‚System.Web.Http.HttpConfiguration..ctor (System.Web.Http.HttpRouteCollection)‘ Zugriff auf Methode 'System.Web.Http.HttpConfiguration.DefaultFormatters()' fehlgeschlagen.


bei System.Web.Http.HttpConfiguration..ctor (HttpRouteCollection Strecken) bei System.Web.Http.HttpConfiguration..ctor() bei EyeShield.Api.Tests.PersonsControllerTests.Get_Persons_ReturnsAllPersons()

Um ehrlich zu sein, habe keine Ahnung, was das Problem hier sein könnte. Hat jemand eine Idee, was könnte das Problem hier sein?

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

Einheit 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

ich genau das gleiche Problem haben. Hast du jemals herausgefunden, was hier passiert ist? –

+0

@Ev Behebung des Problems, aber Aktualisierung aller Bibliotheken im Projekt. – Avangar

Antwort

14

Versuchen Sie sicherzustellen, dass Microsoft.AspNet.WebApi.Client installiert ist.

Meine App funktionierte nicht, weil ich das aus anderen Gründen entfernt hatte.

Paket öffnen Manager-Konsole und ausführen:

Install-Package Microsoft.AspNet.WebApi.Client

+5

Obwohl ich nicht sicher sein kann, denke ich, dass Sie Recht haben, löste mein Problem, wenn ich alle Pakete in meinem Projekt mit Nuget Update. – Avangar

+5

In meinem Fall war es eine Diskrepanz zwischen den Versionen von Microsoft.AspNet.WebApi.Client und Microsoft.AspNet.WebApi.Core, ich habe versucht, beide zu aktualisieren und voila. – Marcus

Verwandte Themen