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

Domain driven design 我是否需要在域驱动设计中测试域服务?,domain-driven-design,Domain Driven Design,我正在使用域驱动设计开发一个控制台应用程序,我试图将域逻辑尽可能多地保留在域实体中,但有些逻辑如何泄漏到域服务中,所以现在,我是否需要测试域服务,如果是,如何做?是,如果它们包含逻辑,则必须测试它们 如果服务已正确解耦,则应该可以使用单元测试和依赖项注入对其进行测试。这取决于您使用的框架。使用C#并根据项目的复杂性,我会利用DI和工厂(如果有的话),或者(回顾性地)使用SpecFlow和Moq实现一些功能测试,给定您在实现域服务时应该编写的接口契约。起点在于安装SpecFlow,然后,您应该创建

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

是,如果它们包含逻辑,则必须测试它们


如果服务已正确解耦,则应该可以使用单元测试和依赖项注入对其进行测试。

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


首先,始终确保您的域服务是无状态的

域服务的通常角色是验证和持久性。在这些情况下,只需创建他们使用的基础设施服务的mock/stub/dummie,在单元测试中传递它们,并在这些mock上断言某些行为。一切照旧。有时域服务需要实体。模仿并传递这些信息。像往常一样断言

不可避免地会有人附和这句古老的话:“但域服务不是持久性的”。如果一个域服务处理/使用某种持久性机制(存储库/网关)来完成某些职责,那么“英语”说“它通常的角色是持久性之类的东西”是完全合理的

别挡道了。DDD没有制定脱钩目标。良好的DDD允许您的所有业务逻辑在域中发生。使域服务成为无状态可以实现这一点。和VO一样,它可以使DS从外层安全通行。让DS的API与您的通用语言保持一致,可以确保它们在您的领域内始终是一个连贯的组织单元

“但DS与持久性无关”。。只有当无处不在的语言不是,而且通常不是,那么DS API在这些情况下不应该反映持久性机制。但它肯定会有使用大量持久性的内部方法,并且您需要使用mock/stubs/dummie来在单元测试中对付这些笨蛋。域服务不是用于保持层分离的架构脚手架。它们是更高级别域逻辑的组织单元。

都是关于域逻辑的,因此它们必须经过测试

这样做就更简单了,因为它们几乎没有依赖关系,尤其是通常不与执行缓慢I/O操作的基础结构类耦合


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

考虑域服务,您所说的“无状态”是什么意思。无状态服务只是一个模块,它不跟踪从一个调用到另一个调用的信息。例如,在调用之间更改实例变量的服务类不是无状态的。该服务可能有在构建期间设置的实例变量(如基础设施服务),但可能没有更改数据的方法。它所需要的一切都应该在方法调用过程中传递。我觉得我理解了你的解释,你能提供一个同样的例子吗@SephVelut@SephVelut域服务与持久性无关。域不应该知道持久性。验证。。。这取决于您的意思,但应用程序服务主要是它发生的地方。@guillaume31错了。域服务的实现通常使用存储库、网关或其他一些基础设施服务。域服务的接口模型仍然对基础设施一无所知。此外,问题是关于测试,并且您测试实现,因此您的测试可能需要模拟一些基础架构的东西才能获得域服务。