Модульное тестирование классов, управляемых только доменом - PullRequest
4 голосов
/ 13 февраля 2011

Я стремлюсь создать систему, основанную на чисто доменном дизайне. Насколько я знаю, это означает, что мои доменные объекты должны иметь поведение, а не форму. То есть они не должны иметь никаких добытчиков или других средств доступа.

В то же время я пытаюсь следить за процессами 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;}
}

Если получателям не разрешено, как мне проверить, что методы CreatePurchaseOrder () работают правильно и устанавливают значение 1.

Это большое концептуальное препятствие для меня при попытке реализовать этот дизайн, поэтому любой совет будет действительно полезным.

Спасибо

Ответы [ 2 ]

6 голосов
/ 13 февраля 2011

Почему доменный объект не может иметь свойства?Чистое поведение, о котором вы говорите, это просто статические методы, они не имеют ничего общего с объектами домена.

Википедия говорит нам:

бизнес-объектобычно сам ничего не делает, но содержит набор переменных или свойств экземпляра, также называемых атрибутами и связями с другими бизнес-объектами, создавая карту объектов, представляющих деловые отношения.

Модель предметной области, где бизнес-объекты нетакое поведение называется анемичной моделью предметной области.

Итак, получается, что объект домена должен иметь свойства и (в большинстве случаев) поведение.

Мартин Фаулер говорит:

Модель домена - объектная модель домена, которая включает как поведение, так и данные

1 голос
/ 16 февраля 2011

Один из способов достижения этого - следовать CQRS идеям.

CQRS отделяет запросы от поведения на архитектурном уровне (отсюда и название) и использует опубликованные события модели предметной области для представления состояния.

Но это довольно сложно понять и правильно реализовать. Особенно, если у вас нет опыта работы с проектными идеями в целом.

Поэтому - не стесняйтесь выставлять состояние, просто убедитесь, что оно может быть изменено только из самого объекта.

...