Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法从System.Reflection.TypeInfo创建实例

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
var sut = new Mock<DiagnosticController>().Object; //This works
EN

回答 2

Stack Overflow用户

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

试试这个:

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

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

https://stackoverflow.com/questions/57041562

复制
相关文章
快速创建 Linux 实例
2. 在线充值。 轻量应用服务器以包年包月模式售卖,购买前,需要在账号中进行充值。具体操作请参考 在线充值 文档。
CiiLii西里网
2023/08/23
2110
快速创建 Linux 实例
Nova创建实例类型
创建一个实例类型名为:至尊型,ID为zzx,内存为8192M,系统盘为50G,CPU为8核,临时磁盘为:1G
院长技术
2021/02/19
1K0
Nova创建实例类型
创建bean的实例
本文将详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。先来了解一下方法的大致脉络。
程序员酷森
2020/10/19
1.5K0
【Linux系列】无法创建用户useradd:无法打开 /etc/passwd
事情起因源自阿里云服务上安装ES(elasticsearch),学习ES的路上可能都会遇到的一个问题,就是无法在root账户下启动ES服务,具体报错信息如下:
沁溪源
2021/08/13
7.3K0
MySQL从删库到跑路(四)——MySQL数据库创建实例
创建数据库,指定数据库的默认字符集为utf8。 create database schoolDB default character set utf8; 连接数据库,客户端必须选择UTF8字符集。 数据库中的三张表分别为学生表(student)、课程表(TSubject)、分数表(TScore)。
良月柒
2019/03/20
2.4K0
MySQL从删库到跑路(四)——MySQL数据库创建实例
activexobject对象不能创建_无法创建office组件对象
JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用。
全栈程序员站长
2022/11/04
1.8K0
使用 FactoryBean 接口创建实例
可以通过实现 FactoryBean<T> 接口,然后创建一个实例到 Spring 容器中。
水货程序员
2018/11/13
1.8K0
rabbitmq实例_rabbitmq创建队列
RabbitMQ是一个受欢迎的消息代理,通常用于应用程序之间或者程序的不同组件之间通过消息来进行集成。具有高可用高并发的优点,适合集群服务器。采用 Erlang实现, 对主要的编程语言都有客户端支持。
全栈程序员站长
2022/11/09
1.4K0
rabbitmq实例_rabbitmq创建队列
Vue 3 创建应用实例
本章节主要是对 Vue 应用实例的讲解,我们都知道在 Vue 2.x 是通过 new Vue() 来创建 Vue 应用的,但是在 Vue 3.0 中不是这样的,使用 createApp() 来创建实例的。接下来我们就来好好讲讲 Vue 应用实例。
公众号---人生代码
2020/11/03
4.3K0
Vue 3 创建应用实例
Jenkins实例 创建Maven项目
安装如下插件 Maven Integration plugin Git PreBuildMerge Trait Plugin Publish over SSH 并配置
陈不成i
2021/06/04
1.2K0
ORA-27040: 文件创建错误, 无法创建文件
SQL 错误: ORA-01119: 创建数据库文件 ' F:\oracle\product\10.2.0\oradata\orcl\GIMSsS.dbf' 时出错 ORA-27040: 文件创建错误, 无法创建文件 OSD-04002: 无法打开文件 O/S-Error: (OS 123) 文件名、目录名或卷标语法不正确。 01119. 00000 - "error in creating database file '%s'" *Cause: Usually due to not having enough space on the device. *Action:
西门呀在吹雪
2020/11/09
4.3K0
ORA-27040: 文件创建错误, 无法创建文件
创建MySQL从库
我们知道Oracle有DataGuard实时备份数据。能够做主备切换,而MySQL也有自己的一套备库方案。称之为主从复制。
全栈程序员站长
2022/07/10
1.6K0
Python中动态创建类实例
简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下: def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_name]) class_m
kongxx
2018/05/14
2.4K0
腾讯云快速创建 Windows 实例
2. 在线充值。 轻量应用服务器以包年包月模式售卖,购买前,需要在账号中进行充值。具体操作请参考 在线充值 文档。
CiiLii西里网
2023/08/23
3110
腾讯云快速创建 Windows 实例
Spring的bean创建实例详解
IoC容器,又名控制反转,全称为Inverse of Control,其是Spring最为核心的一个组件,其他的组件如AOP,Spring事务等都是直接或间接的依赖于IoC容器的。本文主要讲解IoC容器所管理的bean的几种创建方式,并且详细讲解了xml配置中相关参数的配置。
田维常
2019/07/16
2.4K0
Spring的bean创建实例详解
批量创建Tomcat(多实例)脚本
[root@localhost ~]# vim auto_deploy_tomcat.sh
用户8449980
2021/07/12
7420
ABAP 创建Rest接口实例
创建完后,用T-code:SICF,创建一个服务,在处理器清单中,添加刚才的类,保存激活后,就生成了服务。
惨绿少年.
2022/05/10
6470
ABAP 创建Rest接口实例
mysql存储过程实例_sql存储过程创建实例详解
我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
全栈程序员站长
2022/09/27
2.3K0
Jenkins实例 创建Maven项目--后记
SSH Server部分 Name是被发布主机的名字,要和配置管理选项里面对应好 Source files 选择打包后的文件,这里为book.tar.gz Remove prefix:移除目录(只能指定Source files中的目录) Remote directory 选择发送到哪个目录,这个是相对于配置管理选择中设置的默认目录。(默认/root) Exec command 是shell脚本,这里是将包解压就可,就算发布完了。
陈不成i
2021/06/04
7070
使用C#创建WebService实例
更改服务程式名称 重命名程式名称 Service1.asmx 修改为 TestService.asmx
全栈程序员站长
2022/09/13
7390
使用C#创建WebService实例

相似问题

无法从java创建实例

11

:无法从机器映像创建实例

13

无法从java类创建实例

20

无法从spring创建RestTemplate()实例

24

无法从DatabaseProviderFactory实例访问创建方法

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文