Вопрос
Как вы обрабатываете поля только для чтения при создании подделок?
Фон
Я нахожусь на начальной стадии использования ASP.Net MVC и в качестве примера использую спортивный магазин Стивена Сандерсона и Notd Dinner Скотта Гу. Одна небольшая проблема, с которой я только что столкнулся, - как работать со свойствами, доступными только для чтения, при подделке. Я использую 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, но скрывает свойства с новыми свойствами чтения-записи.
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
Пока это решение, как я склоняюсь. Это нарушает принцип подстановки Лискова, однако это не сильно беспокоит меня в тестовом проекте. Я был бы рад услышать любую критику и / или отзывы по этому поводу в качестве решения.
Победитель: Mock Frameworks
Мок, кажется, делает эту работу. Мое последнее решение - скрыть свойство с помощью наследования - действительно работает, однако, используя Moq, я получаю стандартизированный набор функций, который более удобен в обслуживании. Я предполагаю, что другие фиктивные фреймворки имеют эту функциональность, но я не проверял. Говорят, что Moq более прост для начинающего написания макетов, чем я определенно сейчас являюсь.