规格模式单元测试

Bur*_*urt 2 c# agile unit-testing design-patterns domain-driven-design

我们最近采用了用于验证域对象的规范模式,现在想要引入域对象的单元测试以提高代码质量.

我发现的一个问题是如何最好地对下面示例中显示的验证功能进行单元测试.规范命中数据库所以我希望能够模拟它,但因为它是在线实例化我不能这样做.我可以处理接口,但这会增加代码的复杂性,因为我们可能有很多规范,我们最终会有很多接口(记住我们正在引入单元测试,并且不想给任何人找借口来拍摄它下).

鉴于这种情况,我们如何才能最好地解决单元测试域对象中规范模式的问题?

...
public void Validate()
{
    if(DuplicateUsername())
    { throw new ValidationException(); }
}

public bool DuplicateUsername()
{
    var spec = new DuplicateUsernameSpecification();
    return spec.IsSatisfiedBy(this);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 5

通过制作核心方法,可以更加温和地将Seams引入应用程序virtual.这意味着您可以使用Extract and Override技术进行单元测试.

在绿地开发中,我发现这种技术不是最理想的,因为有更好的替代方案,但它是将可测试性改进到现有代码的好方法.

例如,您写了您的规范命中数据库.在该实现中,您可以将规范的该部分提取到工厂方法,然后您可以在单元测试中覆盖它.

一般而言," 有效使用遗留代码 "一书为如何使代码可测试提供了许多有价值的指导.