Это типичная эквивалентность проблема и выглядит общепринятом ответ не является хорошим. Я попытаюсь объяснить, почему.
Представьте следующее: вам нужно написать интеграционный тест на своем сервере, чтобы гарантировать, что он сохранит ваш объект домена. У вас есть код:
[TestMethod]
[Description(@"Sequentially perform operations
1. Save new item in DB
2. Get same Item from DB
Ensure that saved and get Items are equivalent")]
public void Repository_Create_Test()
{
var initialItem = GetTestItem();
//create item and check it is created correct
initialItem.ID = repository.Create(initialItem, userID, ownerID);
Item resultItem = repository.GetById(initialItem.ID, ownerID);
resultItem.Should().NotBeNull();
Assert.AreEqual(initialItem, resultItem);
}
Таким образом, вы должны убедиться, что объект чтения из памяти является абсолютным эквивалентом объекта, который мы отправить на хранение. Переопределение Equals
- это легкая первая догадка здесь. Для этого случая нам нужно установить Equals
, чтобы сравнить все поля объектов. Но с точки зрения DDD это просто неправильно. Объекты домена отличаются неизменяемым ключом (или первичным ключом), а не всеми изменяемыми полями. Итак, если мы моделируем область управления персоналом, а гипотетический «Mister X» имеет новый номер телефона, он по-прежнему остается тем же «Mister X».
Все, что сказал, я в настоящее время использую FluentAssertions Framework, у которого есть достаточно мощная возможность для проверки эквивалентности. Как это:
resultItem.ShouldBeEquivalentTo(initialItem);
Вот аналогичный вопрос для NUnit, которая будет полезна: http://stackoverflow.com/questions/318210/compare-equality-between-two-objects-in-nunit –
для фактического выполнения вы хотели бы написать класс утилиты, который сравнивает свойства двух объектов с помощью отражения. На данный момент у меня нет кода под рукой, но нетрудно реализовать такую функциональность. – Juri
Если вы натолкнулись на этот код Юри, я бы с удовольствием посмотрел, что вы сделали. –