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

Do I need to test the domain services in Domain driven design?

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

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

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

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

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

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

域服务的通常作用是验证和持久化。在这些情况下,只需创建 mocks/stubs/dummies 他们使用的基础设施服务,将它们传入单元测试并在这些模拟上断言某些行为。照常营业。有时领域服务需要实体。模拟并传递它们。像往常一样断言。

不可避免地会有人附和一句令人尊敬的声明:"but domain services aren't about persistence"。如果域服务 deals/uses 某种持久性机制 (repository/gateway) 来完成某些职责,那么声明 'its usual role is stuff like persistence'.

是完全合理的 'english'

先不说了。 DDD 不做解耦目标。好的 DDD 允许您的所有业务逻辑在域中发生。使领域服务无状态就可以做到这一点。像 VO 它使 DS 可以安全地从外层传递。使 DS 的 API 与您的通用语言保持一致,确保它们在您的域中保持为一个连贯的组织单元。

"But DS are not about persistence".. 仅当无处不在的语言不是,而且通常不是,所以 DS API 不应该在那些案例反映了持久性机制。但它确实可以拥有使用大量持久性的内部方法,并且您将需要使用 mocks/stubs/dummies 来获取单元测试中的那些吸盘。域服务不是一些用于保持层分离的架构脚手架。它们是更高级别域逻辑的组织单元。

Domain Services都是关于领域逻辑的,所以一定要测试一下。

因为它们 很少有依赖性 ,而且通常不会耦合到基础设施 类 做慢 I/O 的事情,所以做起来更简单。

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