问题
创建假货时如何处理只读字段?
背景
我正处于使用 ASP.Net MVC 的初学者阶段,并且正在使用 Steven Sanderson 的 Sports Store 和 Scott Gu 的 Nerd 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; }
}
到目前为止,这个解决方案是我的倾向。它确实违反了 Liskov 替换原则,但是在测试项目中并没有给我带来太多困扰。我很高兴听到对此作为解决方案的任何批评和/或反馈。
获胜者:模拟框架
起订量似乎可以完成这项工作。事实上,我最后一个通过继承隐藏属性的解决方案确实有效,但是通过使用 Moq,我获得了一组更易于维护的标准化功能。我假设其他模拟框架有这个功能,但我没有检查。据说起订量对于开始模拟写作来说更直接,我现在肯定是这样。