Сравнение сложного объекта в тесте

Пишу юнит-тест на C#, в котором по итогу надо записать объект в БД, а потом получить его и проверить, что все свойства объекта, в том числе и вложенные свойства объектов коллекций, одинаковые.

// Подготовка данных.
MyClass actual = new MyClass(); 
...Инициализация объекта
...Запись в БД

// Получение результата.
MyClass expected = GetFromDb(); // Получение его из БД

// Проверка.
foreach (PropertyInfo property in typeof(MyClass).GetProperties())
{
    if (property == null)
    {
        continue;
    }

    if (property.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
    {
        continue;
    }

    Assert.That(
        property.GetValue(actual),
        Is.EqualTo(property.GetValue(expected)),
        $"Не совпадает значение для {property.Name}."
    );
}

CollectionAssert.AreEqual(
    expected.Collection1,
    actual.Collection1,
    new Collection1ItemComparer(),
    "Не совпадает список Collection1."
);

CollectionAssert.AreEqual(
    expected.Collection2,
    actual.Collection2,
    new Collection1ItemComparer(),
    "Не совпадает список Collection2."
);

С другими типами тоже надо будет это сделать. Есть ли волшебный способ сделать проверку проще? У меня такие варианты:

  1. Делать некий универсальный сравниватель свойств (с дженериками и реализацией IComparer для каждого вложенного типа свойства).
  2. Сериализовать в строку и сравнивать строки. Выглядит ненадежно.
  3. Я неправильно делаю тест и он должен сравнивать только что-то конкретное и простое.

Ответы (0 шт):