在单元测试中区分班级成员和演员班成员

时间:2018-11-25 14:32:24

标签: c# unit-testing generics casting

我有一个通用类,它公开与基类类型和子类类型相同的对象,如下所示:

void Main()
{
    var genericTest = new GenericTestClass<ChildClass>(new ChildClass());
    var baseVal = genericTest.Entity.ValBase;
    var castBaseVal = genericTest.EntityCast.ValBase;
    var castBaseChildVal = genericTest.EntityCast.Val;
    //var wontWork = genericTest.Entity.Val; //AS EXPECTED WILL NOT COMPILE
}

public class GenericTestClass<T> where T : BaseClass
{
    public BaseClass Entity {get;}
    public T EntityCast => Entity as T;
    public GenericTestClass(T myClass)
    {
        Entity = myClass;
    }
}

public class BaseClass
{
    public int ValBase => 1;
}

public class ChildClass : BaseClass
{
    public int Val => 2;
}

正如预期的那样,var wontWork = genericTest.Entity.Val行将不会编译,我想在单元测试中验证这种不同的行为。

我的问题是如何最好地证明EntityEntityCast的不同行为,以确保投射正确工作?显然,它们在检查类型时都返回ChildClass,所以我不能使用Assert.IsType<BaseClass>(genericTest.Entity)

谢谢

1 个答案:

答案 0 :(得分:0)

首先发表评论。交换属性的角色似乎更自然。

public class GenericTestClass<T> where T : BaseClass
{
    public BaseClass Entity => EntityCast;
    public T EntityCast { get; }
    public GenericTestClass(T myClass)
    {
        EntityCast = myClass;
    }
}

如果我对您的理解正确,那么这可能就是您想要的:

var properyEntity = typeof(GenericTestClass<>).GetProperty("Entity");
Assert.AreEqual(typeof(BaseClass), propertyEntity.PropertyType);
Assert.IsNull(typeof(BaseClass).GetProperty("Val"));

您还可以使用GenericTestClass<ChildClass>而不是GenericTestClass<>

但是我不确定像这样的“测试”是否有意义。


您还可以使用这样的方法(具有可疑的价值!):

static Type GetCompiletimeTypeOf<T>(T dummy) => typeof(T);

那么您可以做:

Assert.AreEqual(GetCompiletimeTypeOf(genericTest.Entity), typeof(BaseClass));

与您问题中的var genericTest = new GenericTestClass<ChildClass>(new ChildClass());一样。