首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法从System.Reflection.TypeInfo创建实例

无法从System.Reflection.TypeInfo创建实例
EN

Stack Overflow用户
提问于 2019-07-15 14:10:23
回答 2查看 1.5K关注 0票数 0

我们正试图为我们的ASP.Net核心API控制器创建一个简单的单元测试。我们使用的是带有autoMoq、XUnit2和应该使用的自动夹具。我们如何模拟TypeInfo的创建?还是有更好的方法?

我们遵循这个职位来解决以下的初始错误:

Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary :由于创建意外失败(异常),AutoFixture无法从AutoFixture.ObjectCreationException创建实例。请参考内部异常来调查故障的根本原因。

代码语言:javascript
代码运行次数:0
运行
复制
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派生时,错误就消失了。

代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
var sut = new Mock<DiagnosticController>().Object; //This works
EN

回答 2

Stack Overflow用户

发布于 2019-11-22 13:49:31

试试这个:

代码语言:javascript
代码运行次数:0
运行
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-07-15 14: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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57041562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档