ВопросВ TDD и DDD, как вы обрабатываете свойства только для чтения в подделках?
Как вы обрабатываете поля только для чтения при создании подделок?
фон
Я в начинающих этапах с помощью ASP.Net MVC, и я с помощью спортивного магазина Стивена Сандерсона и Nerd ужина Скотта Гу в качестве примеров. Одна небольшая проблема, с которой я только что столкнулась, заключается в том, как работать с свойствами только для чтения при создании подделок. Я использую LINQToSQL.
Мой интерфейс:
public interface IPersonRespository
{
Person GetPerson(int id);
}
и моя подделка становится
public class FakePersonRepository
{
public Person GetPerson(int id)
{
return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
}
}
Вот моя проблема. Поля id, ssn и totalDrWhoEpisodesWatched доступны только для чтения, поэтому приведенный выше код фактически не работает. Однако я не понимаю, как создать поддельного нового человека и установить свойство только для чтения. Я уверен, что есть решение, но я еще не встречал его в своих поисках.
Обновление: Наследование + Скрытие собственности как потенциальное решение?
Я еще не решил решительного решения проблемы. Мне не нравится понятие модификации моих классов домена для создания подделок. Для меня добавление разметки к классам домена для проведения тестирования - это форма добавленной связи - к реализации вашего теста. Теперь я изучаю еще одну возможность, которая заключается в создании класса FakePerson, который наследуется от Person, но скрывает свойства с новыми свойствами read-write.
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
До сих пор это решение заключается в том, как я склоняюсь. Это нарушает Принцип замещения Лискова, однако это не влечет меня в тестовый проект. Я был бы рад услышать любую критику и/или отзывы об этом в качестве решения.
Победитель: Mock Каркасы
Moq появляется, чтобы сделать работу. Мое последнее решение скрывать свойство через наследование действительно работает, однако, используя Moq, я получаю стандартизованный набор функциональных возможностей, который более удобен в обслуживании. Я предполагаю, что другие макетные рамки имеют эту функциональность, но я не проверял. Мок, как говорят, более прямолинейный для начала макет письма, которое я определенно прямо сейчас.
Почему это собирается быть только для чтения? –
Он установлен только для чтения, поскольку ни один пользователь домена не имеет права изменять свойства. Это может быть по ряду причин, но часто, потому что приложение не имеет прав на изменение поля либо потому, что оно является полем с расчетом/автоматическим генерированием, либо из-за политик безопасности базы данных. – John
В слегка несвязанной теме я бы рекомендовал изменить имена своих свойств на PascalCase, чтобы придерживаться соглашений об именах .NET. http://msdn.microsoft.com/en-us/library/ms229043(loband).aspx –