【发布时间】:2011-10-07 21:26:42
【问题描述】:
因此,在构建我的域模型时,我试图务实地只公开驱动行为所必需的内容,但我的单元测试要求我公开仅在类中真正需要的公共 getter。大家是怎么处理的?我的域层只能通过我的应用程序服务层访问,所以 真的 有那么大吗?我应该将它们设为内部并授予测试项目访问权限吗?
任何帮助都会很棒!
【问题讨论】:
标签: c# .net oop domain-driven-design
因此,在构建我的域模型时,我试图务实地只公开驱动行为所必需的内容,但我的单元测试要求我公开仅在类中真正需要的公共 getter。大家是怎么处理的?我的域层只能通过我的应用程序服务层访问,所以 真的 有那么大吗?我应该将它们设为内部并授予测试项目访问权限吗?
任何帮助都会很棒!
【问题讨论】:
标签: c# .net oop domain-driven-design
我认为更改类的公共接口以适应单元测试总是一个坏主意。那就是“摇尾巴”。
如果您必须访问对象的内部状态来测试它,我会在我的测试命名空间中创建一些扩展方法,以便轻松访问对象的私有属性(例如,T GetPropertyValueByName(this string propertyName)。
【讨论】:
在没有看到您的代码的情况下,您的设计似乎需要进行更改以使其更具可测试性。考虑提取一个接口并将dependancy injection 隐含到您的类中,以便您可以在需要时设置内部状态。使用此方法,您可以在构建过程中设置私有成员。还可以尝试使用模拟库。 Moq 是我的最爱。
【讨论】:
我同意 Eric 的说法,即单元测试不应影响类 API。
在您的情况下,听起来您的设计可能不太正确。您说的是需要检查私有变量的单元测试 - 但单元测试应该使用公共 API 完全定义。
要么拆分您的对象,以便在某个层公开私有字段(使对象更细粒度),或者将您的测试更改为不需要访问这些私有字段(使您的单元测试更粗粒度) .
一个有用的工具是Code Contracts. 您可以使用代码契约定义非常细粒度的测试(后置条件和对象不变量,根据私有字段定义),并使您的单元测试更加粗粒度。我的一些单元测试只是调用一个方法并确保代码协定不会触发。
【讨论】:
Story 类要么有SubmittedDate 属性,要么没有;如果没有,那么 UI 层就不能使用它;如果是这样,那么单元测试也可以使用它。对我来说,只有 UI 层才能读取内部 SubmittedDate 是一种代码异味——它是一个隐藏的 API,它被入侵到了 Story 类,它只存在于您的特定 UI 层。那里的设计依赖走错路了。
您可以将单元测试库设为域库的friend,并将域类的私有成员更改为内部。
【讨论】: