使用反射测试类的所有集合属性都将被实例化

耶罗恩

我正在尝试设计一个单元测试,该测试将检查给定的程序集,以使所有具有空构造函数的非抽象类在实例化时都将实例化其集合属性。这是测试中的系统:

namespace MyProject.Dto.Things
{
    public class Item
    {
        public Item()
        {
            // Second batch of props should be instantiated here...
        }

        // Properties that my test doesn't/shouldn't care about:
        public int IntProp { get; set; }
        public string StringProp { get; set; }

        // Properties my test should account for:
        public List<string> ListProp { get; set; }
        public IList<string> IListProp { get; set; }
        public ISet<string> ISetProp { get; set; }
        public ICollection<string> ICollectionProp { get; set; }
        public IDictionary<string, string> IDictionaryProp { get; set; }
        public Stack<string> StackProp { get; set; }
        public string[] ArrayProp { get; set; }
    }
}

我的第一次尝试是这样的:

[TestFixture]
public class DtoTests
{
    [Test]
    public void NamespaceDtos_WhenDefaultConstructorIsCalled_InstantiatesCollectionProperties()
    {
        bool testWasMeaningful = false;

        foreach (var type in GetEntityTypesWithDefaultConstructor())
        {
            var instance = Activator.CreateInstance(type);
            var collectionProps = type
                .GetProperties()
                .Where(p => typeof(ICollection<>).IsAssignableFrom(p.PropertyType));

            foreach (var prop in collectionProps)
            {
                var val = prop.GetValue(instance);
                Assert.That(val, Is.Not.Null.And.Empty, string.Format("[{0}.{1}]", type.Name, prop.Name));
                testWasMeaningful = true;
            }
        }

        Assert.That(testWasMeaningful, "Expected at least one assertion.");
    }

    private IEnumerable<Type> GetEntityTypesWithDefaultConstructor()
    {
        return Assembly
            .GetAssembly(typeof(MyProject.Dto.Things.Item))
            .GetTypes()
            .Where(t => !t.IsAbstract)
            .Where(t => t.GetConstructor(Type.EmptyTypes) != null);
    }
}

但是,这不起作用,因为该Where子句无法从我的其他程序集中获取正确的属性。我的测试失败,因为它测试的不是单个属性。


尝试修复1号

我已经试过这样的答案

var collectionProps = type
    .GetProperties()
    .Where(m => m.PropertyType.IsGenericType && m.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>));

但这仅能捕获Item.ICollectionProp,而无法测试所有其他内容。


尝试修复2

其次,我已经尝试了另一个问题的答案(使用GetICollectionOrICollectionOfTProperties逐字方法),如下所示:

var collectionProps = type
    .GetICollectionOrICollectionOfTProperties();

但是具有讽刺意味的是,即使Item.ICollectionProp没有实例化,它也会错误地通过测试


尝试修复3

我也尝试过测试所有IEnumerable属性,例如:

var collectionProps = type
    .GetProperties()
    .Where(p => typeof(IEnumerable).IsAssignableFrom(p.PropertyType));

但这将在上失败Item.StringProp,因为stringIEnumerable,我不想在这里对此进行测试。


我不确定我哪里出错了,特别是在使用nr 2时。我什至会认为我的问题是该问题的重复,如果我只有解决方案可以解决的话。

底线:(X)如何在实例化类时测试具有空构造函数的类的所有集合属性是否被实例化,和/或(Y)如何使用反射找到类型的所有集合属性?

塞尼

我建议使用此辅助函数来查找所有基于ICollection或的类型ICollection<>

private static bool IsOrImplementsICollection(Type t)
{
    if (t == typeof (ICollection) || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof (ICollection<>)))
        return true;
    return t.GetInterfaces().Any(IsOrImplementsICollection);
}

在测试中,您可以将where子句更改为:

var collectionProps = type
    .GetProperties()
    .Where(x => IsOrImplementsICollection(x.PropertyType));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何忽略使用反射继承的类的所有隐藏属性?

来自分类Dev

如何使用较小案例类的所有属性实例化Scala案例类?

来自分类Dev

编写测试以查找在类的实例化中使用的所有类型

来自分类Dev

如何使用 C# 反射获取实例化的属性或非 null 的类类型的属性

来自分类Dev

排毒测试已分配给“未定义”,所有e2e都将被跳过

来自分类Dev

在运行时使用反射实例化的List <T>的派生类上的Set属性

来自分类Dev

scala反射实例化具有多个paramLists的类

来自分类Dev

如果类引用原始类型,则所有访问通过ASM生成的类的构造函数的反射方法都将引发NoClassDefFoundError。

来自分类Dev

使用反射将类中的所有静态属性作为对象获取VB.NET

来自分类Dev

使用反射从.class文件实例化Java类

来自分类Dev

实例化目录中的所有类

来自分类Dev

Java实例化所有类

来自分类Dev

使用现有类的属性创建新类时,python如何实例化属性?

来自分类Dev

如何为类的所有实例设置实例属性

来自分类Dev

使用反射来测试内部私有类的方法

来自分类Dev

序列化使用反射填充其属性的类

来自分类Dev

如果我在堆上声明一个类实例,它的所有成员也都将在堆上吗?

来自分类Dev

Terraform:添加单个规则时,所有安全组规则都将被销毁并替换

来自分类Dev

在Java中,所有这些方法都将被视为纯函数吗?

来自分类Dev

循环开始时,其他所有内容都将被忽略

来自分类Dev

从临时表中删除记录时,所有记录都将被删除

来自分类Dev

一种生命结束时,所有粒子都将被删除

来自分类Dev

通过反射实例化泛型类

来自分类Dev

Kotlin 数据类通过反射实例化

来自分类Dev

使用反射获取在Scala中实现特征的所有类

来自分类Dev

无法使用unittest修补由测试的类实例化的类

来自分类Dev

使用foreach访问类的所有实例

来自分类Dev

所有单元测试都将Moq抛出BadImageFormatException吗?

来自分类Dev

实例化从xml序列化的所有类对象

Related 相关文章

  1. 1

    如何忽略使用反射继承的类的所有隐藏属性?

  2. 2

    如何使用较小案例类的所有属性实例化Scala案例类?

  3. 3

    编写测试以查找在类的实例化中使用的所有类型

  4. 4

    如何使用 C# 反射获取实例化的属性或非 null 的类类型的属性

  5. 5

    排毒测试已分配给“未定义”,所有e2e都将被跳过

  6. 6

    在运行时使用反射实例化的List <T>的派生类上的Set属性

  7. 7

    scala反射实例化具有多个paramLists的类

  8. 8

    如果类引用原始类型,则所有访问通过ASM生成的类的构造函数的反射方法都将引发NoClassDefFoundError。

  9. 9

    使用反射将类中的所有静态属性作为对象获取VB.NET

  10. 10

    使用反射从.class文件实例化Java类

  11. 11

    实例化目录中的所有类

  12. 12

    Java实例化所有类

  13. 13

    使用现有类的属性创建新类时,python如何实例化属性?

  14. 14

    如何为类的所有实例设置实例属性

  15. 15

    使用反射来测试内部私有类的方法

  16. 16

    序列化使用反射填充其属性的类

  17. 17

    如果我在堆上声明一个类实例,它的所有成员也都将在堆上吗?

  18. 18

    Terraform:添加单个规则时,所有安全组规则都将被销毁并替换

  19. 19

    在Java中,所有这些方法都将被视为纯函数吗?

  20. 20

    循环开始时,其他所有内容都将被忽略

  21. 21

    从临时表中删除记录时,所有记录都将被删除

  22. 22

    一种生命结束时,所有粒子都将被删除

  23. 23

    通过反射实例化泛型类

  24. 24

    Kotlin 数据类通过反射实例化

  25. 25

    使用反射获取在Scala中实现特征的所有类

  26. 26

    无法使用unittest修补由测试的类实例化的类

  27. 27

    使用foreach访问类的所有实例

  28. 28

    所有单元测试都将Moq抛出BadImageFormatException吗?

  29. 29

    实例化从xml序列化的所有类对象

热门标签

归档