asp.net-mvc – 在TDD和DDD中,你如何处理假货中的只读属性?
题
创建假货时如何处理只读字段? 背景 我正处于使用ASP.Net MVC的初学阶段,我正在使用Steven Sanderson的体育用品店和Scott Gu的书呆子晚餐作为例子.我刚刚遇到的一个小问题是如何在做假货时使用只读属性.我正在使用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是只读的,因此上面的代码实际上不起作用.但是,我不知道如何创建假新人并设置只读属性.我确信有一个解决方案,但我在搜索中还没有遇到过它. 更新:隐藏属性作为潜在解决方案的继承属性? 我还没有决定解决这个问题.我不喜欢为了创造假货而修改我的Domain类的概念.对我来说,为了进行测试而向域类添加标记是一种额外的耦合形式 – 与测试的实现相结合.我现在正在研究另一种可能性,即创建一个继承自Person的FakePerson类,但使用新的读写属性隐藏属性. public class FakePerson: Person { public new int age { get; set; } public new string ssn { get; set; } public new int totalDrWhoEpisodesWatched { get; set; } } 到目前为止,这个解决方案就是我的倾向.它确实打破了Liskov替换原则,但是这并没有在测试项目中给我带来太多麻烦.我很高兴听到任何批评和/或反馈作为解决方案. 获奖者:模拟框架 Moq似乎完成了这项工作.事实上,我通过继承隐藏属性的最后一个解决方案确实有效,但是通过使用Moq,我获得了一组更易于维护的标准化功能.我假设其他模拟框架具有此功能,但我没有检查.据说Moq开始模拟写作更直接,我现在肯定是这样. 解决方法
考虑模拟测试中的Person类型.使用
Moq的示例:
var mock = new Mock<Person>(); mock.SetupGet(p => p.id).Returns("EMP12345"); mock.SetupGet(p => p.ssn).Returns("123-45-6789"); mock.SetupGet(p => p.totalDrWhoEpisodesWatched).Returns(42); return mock.Object; 否则,请尝试了解LINQ to SQL如何设置这些只读属性. 编辑:如果您尝试上述操作并且Moq在SetupGet调用中抛出ArgumentException,并显示消息“无法覆盖的成员上的无效设置:p => p.id”,则需要将该属性标记为虚拟.对于要覆盖其getter的每个属性,都需要执行此操作. 在LINQ to SQL中,可以通过选择属性在OR设计器中完成,然后在Properties窗口中将Inheritance Modifier设置为virtual. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 您可以/应该在用户会话对象中存储多少数据?
- asp.net-mvc – ASP.Net MVC:静态HTML文件的RenderPartial
- 如何在ASP.NET中列出Windows用户和组?
- asp.net – 检查是否存在Web服务
- 在netcore中实现字段和属性注入
- asp.net-mvc-4 – ASP.NET MVC Web Api无法将QueryString映
- .net – 是否必须在自定义实现中覆盖默认的成员资格提供程序
- 如何计算asp.net服务器应用程序中的会话
- asp.net-mvc – Asp.net MVC 4 WEB API – 自定义身份验证令
- 身份验证 – 如何仅为ASP.NET 5中的受保护操作添加令牌验证
- asp.net-mvc – 您对Telerik Extensions for MVC
- 如何使用共享群集上相同端口的子路径在Azure Ser
- asp.net – 更改ContentPlaceHolder的ID
- asp.net-mvc – 如何使这个ASP.NET MVC控制器更易
- asp.net – Application_Start和Application_OnS
- 实体框架 – EF Codefirst和RDLC Reports
- asp.net – 如何通过sqldatasource计算获取的行数
- 简单的ASP.NET应用程序示例(没有Web窗体和MVC)
- asp.net-mvc-3 – Html.Action – 获取与发布
- ASP.NET MVC页面不会加载并说“找不到资源”