Сравнение сложного объекта в тесте
Пишу юнит-тест на 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."
);
С другими типами тоже надо будет это сделать. Есть ли волшебный способ сделать проверку проще? У меня такие варианты:
- Делать некий универсальный сравниватель свойств (с дженериками и реализацией IComparer для каждого вложенного типа свойства).
- Сериализовать в строку и сравнивать строки. Выглядит ненадежно.
- Я неправильно делаю тест и он должен сравнивать только что-то конкретное и простое.