Raj*_*esh 6 c# tdd unit-testing domain-driven-design
在我们的Core域模型设计中,我们有一个名为"Category"的类,其构造函数是内部设计的.由于构造函数是内部的,因此在编写单元测试用例时,我将无法创建"类别"对象.
所以我的问题是,将构造函数公开以使"类别"类可测试是最佳做法吗?或者我不应该测试"类别",而应该测试负责创建此对象的类/方法?
钽,
Rajeesh
不要仅为了单元测试而使构造函数公开.如果从设计点开始你决定它应该是内部的,那么就这样离开.测试调用此构造函数的类.
在.NET中有InternalsVisibleToAttribute,它允许您将内部成员公开给单元测试.
TDD意味着测试驱动设计,并且对此的证据是,如果您无法对其进行测试,那么构造函数就不能真正"内部设计".
考虑为什么它是内部的.这将告诉您如何解决该问题.您不应该将构造函数设置为公开只是为了能够测试它,但您应该考虑一种可以轻松创建新实例的设计.
通常,构造函数是内部的,以保护不变量,但您也可以使用公共构造函数实现相同的目标,该构造函数将所需的输入作为构造函数参数.
public class MyClass
{
private readonly string requiredString;
public MyClass(string requiredString)
{
if (requiredString == null)
{
throw new ArgumentNullException("requiredString");
}
this.requiredString = requiredString;
}
}
Run Code Online (Sandbox Code Playgroud)
注意Guard子句和readonly
关键字的组合如何保护类的不变量.这通常是内部构造函数的一个很好的替代方法.
拥有内部构造函数的另一个原因是当你有一个可以返回多态对象的工厂方法时,但是再次考虑如果构造函数不是指不妥协的话,那么暴露构造函数是否会成为问题.
TDD的美妙之处在于它迫使我们好好看看任何设计决策,并能够真正证明每一个设计决策的合理性.考虑使构造函数内部化然后修改API以使类型易于创建的理由.