【问题标题】:How do you test a business rule when it's a property accessibility?当它是属性可访问性时,如何测试业务规则?
【发布时间】:2011-02-08 14:35:02
【问题描述】:

这就是问题所在。我有一个业务对象,它有一个名为RegisterDate 的字段。像往常一样的业务规则说,一旦设置,就无法更改。

我首先想到的是将此字段实现为属性并将设置器定义为受保护,以防止用户在创建对象后使用(和设置)它。但经过一段时间的思考,我让我在属性可访问性规则中偷偷添加了一条业务规则。

我的第二个想法是让属性设置器公开,在设置时实现一个异常,这使得业务规则非常明确。将有一个测试用例期望该属性在每次有人尝试设置它时抛出异常。

好吧,但是为了避免行为,有很多样板,为什么不把东西保护起来,甚至避免在代码的其他部分被滥用?但是后来我想知道,如果另一个开发人员不小心更改了属性可访问性并再次将其公开,并且业务对象的用户开始使用该字段违反业务规则怎么办?

这种情况的最佳方法是什么?你会如何解决这个问题?

【问题讨论】:

  • 很好的技术示例,但我的课程是实体框架生成的,我也在寻找一种方法来确保此业务规则经过单元测试。
  • “但后来我想知道,如果另一个开发人员不小心更改了属性的可访问性并再次将其公开怎么办” - 如果您正在走这条路,为什么不考虑另一个开发人员进入并用奶酪替换你的整个代码?
  • @Ilia:因为那会很愚蠢,否则在现实世界中,通过团队合作,有人很容易获得代码,只看到一个与其他关键字不同的可访问性关键字并想知道:“这家伙可能打错了。”
  • 好吧,也许他们可以认为异常抛出是错误的,并有助于将其编辑掉。我的观点是代码和语言特性是实现业务规则的唯一手段。如果你不能确定你的代码的完整性,那么一切都会消失。如果您担心,请将您的库作为二进制文件分发。

标签: .net entity-framework testing properties business-rules


【解决方案1】:

如果您只能在构造函数中设置它,您可以将该字段设为只读。

public class SomeClass
{
  public SomeClass(DateTime regDate)
  {
     registerDate = regDate;
  }

  public DateTime RegisterDate { get { return registerDate; } }

  private readonly DateTime registerDate;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2019-08-14
    相关资源
    最近更新 更多