我是否需要在域驱动设计中测试域服务?

时间:2015-04-30 14:14:03

标签: domain-driven-design

我正在使用域驱动设计开发一个控制台应用程序,我试图尽可能地将域逻辑保存到域实体中,但是有些如何,一些逻辑泄漏到域服务中,所以现在,我是否需要测试域服务,如果是的话怎么做?

4 个答案:

答案 0 :(得分:5)

是的,如果它们包含逻辑,则必须对它们进行测试。

如果服务正确解耦,应该可以使用单元测试和依赖注入来测试它。

答案 1 :(得分:3)

首先要确保您的域名服务是无状态的。

域服务的常见角色是验证和持久性等。在这些情况下,只需创建他们使用的基础设施服务的模拟/存根/假人,传递它们,在单元测试中并在这些模拟中断言某些行为。照常营业。有时域服务需要实体。嘲笑并传递那些。像往常一样断言。

不可避免地会有人对以下令人尊敬的陈述表示赞同:“但域名服务不是关于持久性”。如果域服务处理/使用一些持久性机制(存储库/网关)来完成一些责任,那么说“它通常的角色就像持久性”这样的“英语”是完全合理的。

有了这个。 DDD没有实现脱钩目标。良好的DDD允许您的所有业务逻辑在域中发生。使域服务无状态实现了这一点。像VO一样,DS可以安全地从外层传递。保持DS的API与您无处不在的语言保持一致,确保它们仍然是您所在域内的一个连贯的组织单位。

“但DS并不是关于持久性”...... 只有普遍存在的语言不是,而且往往不是,所以DS API在这些情况下不应该反映持久性机制。但是它肯定会有内部方法使用大量的持久性,你需要使用模拟/存根/假人来获取单元测试中的吸盘。域服务不是用于保持图层分离的一些架构脚手架。它们是更高级域逻辑的组织单位。

答案 2 :(得分:3)

Domain Services都是关于域逻辑的,所以它们一定要经过测试。

这样做更加简单,因为它们具有非常少的依赖,特别是通常没有耦合到执行缓慢I / O的基础结构类。

域层位于应用程序的中心,并且不与任何其他层紧密耦合,大多数调用将保持在其边界内。如果域服务想要与外界通信,他们通常会使用事件。因此,在测试它们时,您应该几乎不需要任何模拟或存根。

答案 3 :(得分:1)

这取决于您使用的框架。使用C#并根据项目的复杂性,我会利用DI和工厂(如果有的话),或者使用SpecFlow和Moq实现一些功能测试(回顾性),给出在实现域服务时应该编写的接口契约。起点将包括安装SpecFlow,然后,您应该创建一个专用的测试项目...

http://www.specflow.org/getting-started/