【问题标题】:Domain Model (Exposing Public Properties)领域模型(公开公共属性)
【发布时间】:2011-10-07 21:26:42
【问题描述】:

因此,在构建我的域模型时,我试图务实地只公开驱动行为所必需的内容,但我的单元测试要求我公开仅在类中真正需要的公共 getter。大家是怎么处理的?我的域层只能通过我的应用程序服务层访问,所以 真的 有那么大吗?我应该将它们设为内部并授予测试项目访问权限吗?

任何帮助都会很棒!

【问题讨论】:

    标签: c# .net oop domain-driven-design


    【解决方案1】:

    我认为更改类的公共接口以适应单元测试总是一个坏主意。那就是“摇尾巴”。

    如果您必须访问对象的内部状态来测试它,我会在我的测试命名空间中创建一些扩展方法,以便轻松访问对象的私有属性(例如,T GetPropertyValueByName(this string propertyName)。

    【讨论】:

    【解决方案2】:

    在没有看到您的代码的情况下,您的设计似乎需要进行更改以使其更具可测试性。考虑提取一个接口并将dependancy injection 隐含到您的类中,以便您可以在需要时设置内部状态。使用此方法,您可以在构建过程中设置私有成员。还可以尝试使用模拟库。 Moq 是我的最爱。

    【讨论】:

      【解决方案3】:

      我同意 Eric 的说法,即单元测试不应影响类 API。

      在您的情况下,听起来您的设计可能不太正确。您说的是需要检查私有变量的单元测试 - 但单元测试应该使用公共 API 完全定义。

      要么拆分您的对象,以便在某个层公开私有字段(使对象更细粒度),或者将您的测试更改为不需要访问这些私有字段(使您的单元测试更粗粒度) .

      一个有用的工具是Code Contracts. 您可以使用代码契约定义非常细粒度的测试(后置条件和对象不变量,根据私有字段定义),并使您的单元测试更加粗粒度。我的一些单元测试只是调用一个方法并确保代码协定不会触发。

      【讨论】:

      • 我有一个带有方法调用 Submit 的 Story 类。在该方法中,我设置了提交日期属性。现在,我的域层中的任何地方都没有使用该属性值。但是读取层将其用于显示目的。这有帮助吗?仅出于 UI 气味的原因将其公开。我的测试对它进行断言,以确保它被正确设置。
      • @Marco 如果属性 SubmittedOnDate 是故事的属性,那么公开它有什么问题?
      • 我觉得那不会有味道。我支持每一层都是独立的,都有自己的公共 API(除非绝对必要,否则没有内部)。所以Story 类要么有SubmittedDate 属性,要么没有;如果没有,那么 UI 层就不能使用它;如果是这样,那么单元测试也可以使用它。对我来说,只有 UI 层才能读取内部 SubmittedDate 是一种代码异味——它是一个隐藏的 API,它被入侵到了 Story 类,它只存在于您的特定 UI 层。那里的设计依赖走错路了。
      • 我刚刚看了一些关于 DDD 的文章,他们似乎在谈论暴露 public setter 和 getter 的邪恶,仅此而已。
      • 我也读过一些反对公共 getter/setter 的文章;但我最终对他们说我。我只是看不出删除属性在哪里可以显着改进设计。
      【解决方案4】:

      您可以将单元测试库设为域库的friend,并将域类的私有成员更改为内部。

      【讨论】:

        猜你喜欢
        • 2013-02-13
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-11-26
        • 2011-09-06
        • 1970-01-01
        • 2017-05-20
        • 2014-10-10
        相关资源
        最近更新 更多