Ava*_*gar 20 c# unit-testing moq asp.net-web-api
我的单元测试我的WEB API控制器有问题,我正在使用moq模拟我的存储库,进行设置和响应.然后使用模拟存储库启动控制器.问题是当我尝试从控制器执行调用时,我得到一个异常:
尝试通过方法'System.Web.Http.HttpConfiguration..ctor(System.Web.Http.HttpRouteCollection)'访问方法'System.Web.Http.HttpConfiguration.DefaultFormatters()'失败.
在EyeShield.Api.Tests.PersonsControllerTests.Get_Persons_ReturnsAllPersons()的System.Web.Http.HttpConfiguration..ctor()的System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection路由)中
说实话,不知道这里可能出现什么问题.有谁知道这里可能存在什么问题?
控制器:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ev.*_*Ev. 15
尝试确保安装了Microsoft.AspNet.WebApi.Client.
我的应用程序无法运行,因为我因其他原因删除了该应用程序.
打开包管理器控制台并执行:
安装包Microsoft.AspNet.WebApi.Client
确保以下Nuget打包库的版本相同:
Microsoft.AspNet.WebApi
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.WebHost
Run Code Online (Sandbox Code Playgroud)