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;
}
}
}
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? –
@Ev Đã giải quyết vấn đề nhưng cập nhật tất cả thư viện trong dự án. – Avangar