我们正试图为我们的ASP.Net核心API控制器创建一个简单的单元测试。我们使用的是带有autoMoq、XUnit2和应该使用的自动夹具。我们如何模拟TypeInfo的创建?还是有更好的方法?
我们遵循这个职位来解决以下的初始错误:
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary :由于创建意外失败(异常),AutoFixture无法从AutoFixture.ObjectCreationException创建实例。请参考内部异常来调查故障的根本原因。
namespace Tests.Controllers
{
using Api.Controllers;
using AutoFixture;
using AutoFixture.AutoMoq;
using Shouldly;
using System.Threading.Tasks;
using Xunit;
public class DiagnosticControllerTests
{
private readonly DiagnosticController _sut;
public DiagnosticControllerTests()
{
var fixture = new Fixture();
fixture.Customize(new AutoMoqCustomization())
.Customize(new ApiControllerCustomization()); // from Matt Uliasz see link above
_sut = fixture.Create<DiagnosticController>();
}
[Fact]
public async Task Ping_Returns_True()
{
var actual = await _sut.Ping();
actual.Data.ShouldBe(true);
}
}
}
这会引发以下错误:
AutoFixture.ObjectCreationExceptionWithPath AutoFixture无法从System.Reflection.TypeInfo创建实例,因为异常情况下,创建意外失败。请参考内部异常来调查故障的根本原因。..。内部异常消息: Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:不能实例化类: System.Reflection.TypeInfo的代理。找不到无参数构造函数。
编辑在进一步测试之后,当我们停止从类Microsoft.AspNetCore.Mvc.Controller派生时,错误就消失了。
namespace Api.Controllers
{
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Models;
using System.Threading.Tasks;
[Authorize]
[Route("api/[controller]")]
public class DiagnosticController: Controller
{
[AllowAnonymous]
[HttpGet]
[Route("ping")]
public Task<PingResultDto> Ping()
{
var result = new PingResultDto
{
Data = true
};
return Task.FromResult(result);
}
}
}
编辑2我们目前的工作是不使用AutoFixture/AutoMoq:
var sut = new Mock<DiagnosticController>().Object; //This works
发布于 2019-11-22 05:49:31
试试这个:
internal class ControllerBaseCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(
new FilteringSpecimenBuilder(
new Postprocessor(
new MethodInvoker(
new ModestConstructorQuery()),
new ControllerBaseFiller()),
new ControllerBaseSpecification()));
}
private class ControllerBaseFiller : ISpecimenCommand
{
public void Execute(object specimen, ISpecimenContext context)
{
if (specimen == null) throw new ArgumentNullException(nameof(specimen));
if (context == null) throw new ArgumentNullException(nameof(context));
if (specimen is ControllerBase controller)
{
controller.ControllerContext = new ControllerContext
{
HttpContext = (HttpContext)context.Resolve(typeof(HttpContext))
};
}
else
{
throw new ArgumentException("The specimen must be an instance of ControllerBase", nameof(specimen));
}
}
}
private class ControllerBaseSpecification : IRequestSpecification
{
public bool IsSatisfiedBy(object request) => request is Type type && typeof(ControllerBase).IsAssignableFrom(type);
}
}
发布于 2019-07-15 06:15:05
请注意,我下面的回答并没有真正解决您的问题,但这是一个更多的提示:
我觉得你把考试搞得太复杂了。
记住,单元测试是为核心业务逻辑保留的。
对于端到端的测试,应该进行集成测试。
如果您想继续进行集成测试,请使用以下代码:https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2
如果您真的想测试您的控制器:https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/testing?view=aspnetcore-2.2
https://stackoverflow.com/questions/57041562
复制相似问题