TDD,DDD和封装

Jus*_*tin 23 c# tdd getter encapsulation domain-driven-design

经过几年跟随我工作地点"建筑师"传下来的不良做法并认为必须有更好的方法,我最近一直在阅读TDD和DDD,我认为原则和实践将是一个非常适合我们编写的软件的复杂性.

但是,我见过的许多TDD示例都在域对象上调用一个方法,然后测试对象的属性以确保正确执行行为.

另一方面,业内几位受人尊敬的人(Greg Young最着名的是关于CQRS的讨论)主张通过删除所有"getters"来完全封装每个域对象.

因此,我的问题是:如果禁止检索域状态,如何测试域对象的功能?

我相信我缺少一些基本的东西,所以请随时称我为白痴并启发我 - 任何指导都将非常感谢.

Gav*_*ler 17

你所描述的是状态验证,其中你断言域对象的状态.TDD的一个分支称为行为验证,它利用了Mock对象.

行为验证允许您指定应调用哪些方法,如果需要,还可以指定不调用哪些方法.

请阅读Martin Fowler的这篇文章了解更多细节:Mocks不是Stubs.


Rog*_*son 9

好的,这个答案是一年太晚了;-)

但是,当您想要测试CQRS模型时,可以对触发的域事件进行断言,而不是对实体状态进行断言.

例如,如果您想测试是否调用:customer.Rename("Foo")会导致正确的行为.

而不是测试customer.Name是否等于"foo",而是测试在待处理事件存储中是否存在值为"Foo"的待处理CustomerRename事件.(根据实施情况,在您的uow或您的实体事件列表中)