Различать членов класса и членов класса в модульном тесте - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть универсальный класс, который предоставляет один и тот же объект как базовый класс, так и дочерний класс следующим образом:

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 не скомпилируется, и я хочучтобы проверить это отличающееся поведение в модульных тестах.

Мой вопрос состоит в том, как наилучшим образом продемонстрировать отличающиеся поведения Entity и EntityCast, чтобы подтвердить, что приведение работает правильно?Очевидно, они оба возвращают ChildClass при проверке типа, поэтому я не могу использовать Assert.IsType<BaseClass>(genericTest.Entity).

Спасибо

1 Ответ

0 голосов
/ 25 ноября 2018

Первый комментарий.Кажется более естественным поменяться ролями свойств.

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()); как в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...