单元测试纯域驱动的类

Los*_*WPF 4 c# tdd nunit unit-testing domain-driven-design

我的目标是创建一个基于纯域驱动设计的系统.据我所知,这意味着我的域对象应该有行为而不是形状.也就是说,他们不应该有任何吸气剂或其他访问者.

与此同时,我正在尝试遵循TDD流程,并遇到了我正在尝试编写测试的绊脚石.

[Test]
public class new_purchase_order_should_have_purchase_ordernumber_of_1
{
     PurchaseOrder po = PurchaseOrder.CreatePurchaseOrder()
     Assert.AreEqual(1,po.PurchaseOrderNumber); 
}

public class PurchaseOrder
{
       private int _purchaseOrderNumber;
       static CreatePurchaseOrder()
       {
           _purchaseOrderNumber = SomeWayOfGettingAPONumber()
           //other initialisation
       }

        public int PurchaseOrderNumber {get { return _purchaseOrderNumber;}
}
Run Code Online (Sandbox Code Playgroud)

如果不允许使用getter,如何验证CreatePurchaseOrder()方法是否正确运行并将值设置为1.

在尝试实现这个设计时,这对我来说是一个很大的概念障碍,因此任何建议都非常有用.

谢谢

gor*_*gor 6

为什么域对象不能拥有属性?你谈到的纯粹行为,它只是静态方法,它们与Domain Objects无关.

维基百科告诉我们:

业务对象本身通常不执行任何操作,但包含一组实例变量或属性(也称为属性)以及与其他业务对象的关联,编织表示业务关系的对象映射.

业务对象没有行为的域模型称为Anemic Domain Model.

因此,转向,域对象应该具有属性和(在大多数情况下)行为.

马丁福勒说:

域模型 - 包含行为和数据的域的对象模型

  • 这种"对象从不暴露状态"的事情令人困惑和错误.如果没有任何对象暴露任何状态,那么我们就有静音系统.这样就消除了首先使用它们的任何一点.不幸的是,"无国家"的事情源于中国人的低语式误解.OO状态的原则(1)"与表示分离的接口"和(2)"用行为封装数据".换句话说:(1)不要将类的内部设计暴露给它的客户端.那*不意味着你不允许公开财产.(2)不要建立贫血阶层. (6认同)