Мне нравится использовать плавные компоновщики для тестируемого объекта, чтобы выразить природу объекта, который я создаю. ObjectMothers, как правило, становятся громоздкими и имеют тенденцию (в реализациях, с которыми я сталкивался) в конечном итоге скрывать детали создания объектов.
Сравнить:
User fred = CreateUser("fred").WithReputation(900)
.WithScholarBadge()
.WithCriticBadge()
против
User fred = UserObjectMother.Fred()
Чтобы выразить идею, что у пользователя есть повтор 900, и эти два конкретных значка было бы непривычно делать с ObjectMother. Я обнаружил тенденцию, когда разработчики находят этот метод, который создает Fred()
, что близко к тому, что им нужно, поэтому они добавляют больше атрибутов к объекту. Свободный конструктор, с другой стороны, выразителен в отношении того, что строится, и при необходимости легко создает конкретных пользователей для теста.
Тем не менее, я также использую эти шаблоны исключительно в тестовом коде, поскольку производственный код обычно не требует такого рода выразительности.