【发布时间】:2009-06-08 15:38:00
【问题描述】:
问题
在创建假货时如何处理只读字段?
背景
我正处于使用 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,我获得了一组更易于维护的标准化功能。我假设其他模拟框架有这个功能,但我没有检查。据说起订量对于开始模拟写作来说更直接,我现在肯定是这样。
【问题讨论】:
-
为什么设置为只读?
-
设置为只读,因为该域的任何用户都无权修改属性。这可能有多种原因,但通常是因为应用程序无权修改该字段,因为它是一个计算/自动生成的字段,或者是由于数据库安全策略。
-
在一个稍微不相关的主题上,我建议将您的属性名称更改为 PascalCase 以遵守 .NET 命名约定。 msdn.microsoft.com/en-us/library/ms229043(loband).aspx
标签: asp.net-mvc tdd domain-driven-design nerddinner