2014-05-02 16 views
19

Tôi gặp vấn đề với kiểm tra đơn vị bộ điều khiển API WEB của tôi, tôi đang sử dụng moq để giả lập kho lưu trữ của mình, thực hiện thiết lập và phản hồi cho nó. Sau đó, khởi tạo bộ điều khiển với kho lưu trữ giả. Vấn đề là khi tôi cố gắng thực hiện một cuộc gọi từ bộ điều khiển tôi nhận được một ngoại lệ:phương pháp truy cập 'System.Web.Http.HttpConfiguration.DefaultFormatters()' không thành công

Nỗ lực bằng phương pháp 'System.Web.Http.HttpConfiguration..ctor (System.Web.Http.HttpRouteCollection)' để truy cập phương thức 'System.Web.Http.HttpConfiguration.DefaultFormatters()' không thành công.


tại System.Web.Http.HttpConfiguration..ctor (HttpRouteCollection tuyến) tại System.Web.Http.HttpConfiguration..ctor() tại EyeShield.Api.Tests.PersonsControllerTests.Get_Persons_ReturnsAllPersons()

Thành thật mà nói không có ý tưởng gì có thể là vấn đề ở đây. Có ai có ý tưởng gì có thể là vấn đề ở đây?

Bộ điều khiển:

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

Tôi có vấn đề chính xác như vậy. Bạn đã bao giờ làm việc ra những gì đã xảy ra ở đây? –

+0

@Ev Đã giải quyết vấn đề nhưng cập nhật tất cả thư viện trong dự án. – Avangar

Trả lời

14

Cố gắng đảm bảo rằng Microsoft.AspNet.WebApi.Client được cài đặt.

Ứng dụng của tôi không hoạt động vì tôi đã xóa vì lý do khác.

Mở Package Manager Console và thực hiện:

Install-Package Microsoft.AspNet.WebApi.Client

+5

Mặc dù tôi không thể chắc chắn rằng tôi nghĩ rằng bạn là đúng, vấn đề của tôi đã giải quyết khi tôi đã cập nhật tất cả các gói trong dự án của tôi với nuget. – Avangar

+5

Trong trường hợp của tôi nó là một sự khác biệt giữa các phiên bản của Microsoft.AspNet.WebApi.Client và Microsoft.AspNet.WebApi.Core, tôi đã cố gắng cập nhật cả hai và thì đấy. – Marcus

Các vấn đề liên quan