Вставьте значения в класс без явного написания их - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть несколько огромных классов, и я не хочу выписывать их все для тестирования, потому что это огромное усилие, и я могу забыть некоторые значения, которые делают тест недействительным.

Messages = new List<Request.Notif.NotifRuleMessages>
{
    new Request.Notif.NotifRuleMessages
    {
        Code = 1234,
        Message = new List<Request.Notif.NotifRuleMessagesMessage>
        {
            new Request.Notif.NotifMessagesMessage
            {
                Status = new Request.Notif.NotifMessagesMessageStatus
                {
                    Code = 1,
                    Bool = true,
                    Test1 = "Test",
                    Test2 = "Test"
                },
                Rules = new List<Request.Notif.NotifMessagesMessageRule>
                {
                    new Request.Notif.NotifMessagesMessageRule
                    {
                        Lengths = new Request.Notif.NotifMessagesMessageRuleLength
                        {
                            Lenght = 1,
                            Lengths = new List<Request.Notif.NotifMessagesMessageRuleLengthLength>
                            {
                                new Request.Notif.NotifMessagesMessageRuleLengthLength
                                {
                                    Type = "Test",
                                    Value = 1
                                }
                            }
                        },
                        Status = new List<Request.Notif.NotifMessagesMessageRuleStatus>
                        {
                            new Request.Notif.NotifMessagesMessageRuleStatus
                            {
                                Test1 = "Test",
                                Test2 = "Test"

Есть ли способ автоматически заполнить все int значения 1 или 0 и все string значения Test и особенно все objects с правильным классом без юнит-тестирования и внешних библиотек * * 1013

1 Ответ

0 голосов
/ 15 февраля 2019

Используя отражение, вы можете рекурсивно заполнять ваши объекты и устанавливать любые значения по умолчанию, которые вы выберете.Небольшой пример вспомогательной функции, которая может сделать это за вас:

void SetDefaults(object testObj)
{
    var props = testObj.GetType().GetProperties();
    foreach (var prop in props)
    {
        if (prop.GetSetMethod() == null)
        {
            continue;
        }

        var propType = prop.PropertyType;
        if (propType == typeof(int))
        {
            prop.SetValue(testObj, 1);
        }
        else if (propType == typeof(bool))
        {
            prop.SetValue(testObj, false);
        }
        // More conditions...
        else
        {
            var ctor = propType.GetConstructor(Type.EmptyTypes);
            var propertyObject = ctor.Invoke(new object[0]);
            SetDefaults(propertyObject);
            prop.SetValue(testObj, propertyObject);
        }
    }
}

Как вы можете видеть, если ваше дерево объектов использует типы, которые не имеют конструкторов по умолчанию (конструкторы без параметров), вам нужно еще немногосложная логика в else -условии.По сути дела, здесь происходит очень упрощенная версия того, что происходит в среде внедрения зависимостей.

Чтобы использовать это, сделайте что-то вроде:

void Main()
{
    TestObject obj = new TestObject();
    SetDefaults(obj);

    Console.WriteLine(obj);
}

class TestObject {
    public int MyInt { get; set; }
    public SubTestObject SubObj { get; set; }
}

class SubTestObject {
    public int MyOwnInt { get; set; }
    public bool MyBoolGetter => 1 > 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...