Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 富域模型的接口_Unit Testing_Design Patterns_Domain Driven Design - Fatal编程技术网

Unit testing 富域模型的接口

Unit testing 富域模型的接口,unit-testing,design-patterns,domain-driven-design,Unit Testing,Design Patterns,Domain Driven Design,在单元测试期间(例如,在测试使用该模型的服务时),富域模型是否应该有接口来帮助隔离 或者富域模型行为是否应该包含在任何相关的单元测试中 编辑: 通过Rich Domain Model,我特别指的是包含逻辑(即非贫血)的域实体。您肯定应该在单元测试中涉及域模型行为。嘲笑这一部分是毫无意义的。实际上,您应该只模拟外部系统。通常,域模型是您应该与其他系统隔离的部分。域模型可以使用接口,以便与外部系统隔离,等等 然而,在最常见的场景中,域模型是您试图防止外部系统、UI逻辑等不断恶化的影响的对象,而不是相

在单元测试期间(例如,在测试使用该模型的服务时),富域模型是否应该有接口来帮助隔离

或者富域模型行为是否应该包含在任何相关的单元测试中

编辑:


通过Rich Domain Model,我特别指的是包含逻辑(即非贫血)的域实体。

您肯定应该在单元测试中涉及域模型行为。嘲笑这一部分是毫无意义的。实际上,您应该只模拟外部系统。

通常,域模型是您应该与其他系统隔离的部分。域模型可以使用接口,以便与外部系统隔离,等等

然而,在最常见的场景中,域模型是您试图防止外部系统、UI逻辑等不断恶化的影响的对象,而不是相反

因此,没有什么理由将接口放在域模型上

富域模型应该有接口吗

我会说不,因为

  • 域行为发生在分隔良好的气泡内。给定的命令在单个聚合中触发更改。从概念上讲,您不必孤立它,因为它基本上只与自身对话。它还可能向外部世界发出消息(事件),但测试并不要求域实体本身是可模拟的

  • 具体地说,域实体(或值对象)行为是流动的,它发生在内存中,不应该直接调用较低级别的I/O绑定操作。只要被测系统是一个小的准备好的对象集群(聚合,可能还有调用它的东西),那么在测试中不模拟东西不会对性能产生任何影响

  • 领域模型是一个具体概念的领域。反映在实体或值对象类/方法名称中的普遍存在的语言术语通常是平淡无奇的。这里不需要太多的抽象和多态性——这就是接口或抽象类的用途。该领域不太关注提供服务的通用合同或接口,而更关注问题领域中发生的实际任务


我理解您的观点,我更多地指的是应用程序或域服务,例如,它们可能正在协调许多域模型对象。为了只测试服务逻辑,是否应该模拟这些对象的行为?@BrettPostin这些服务与域模型有何不同?他们没有描述域模型的行为吗?抱歉,我可能应该更具体一点,我真正的意思是丰富的域实体。当单元测试使用它们的其他类时,它们的逻辑应该被模仿吗?@MarkSeemann您如何为您的域对象编写独立/单独测试(从J.B.Rainsberger的“集成测试是骗局”论点或Jay Fields的“有效地处理单元测试”,即伪造几乎所有的合作者的意义上讲)?如果你想沿着那条路走下去,你需要在适当的地方缝上接缝。例如,在C#中,你不能只提供一个假的collaborator类,而不“虚拟化”所有东西或在适当的地方有一个接口。我知道这可能会让独立测试走得太远,但我一直在想这个问题。想法?@prgmtc我不久前也在同一条船上,直到我意识到在一个域模型中,被测试的系统(Rainsberger术语中的“星”)是整个集合,而不仅仅是一个对象。聚合只与自身进行通信,大多数有意义的逻辑都存在于聚合根级别的入口点处发生的不变量中。尝试单独测试其每个实体就像尝试单独测试对象的私有方法一样。