Domain driven design 我的集成测试是否应该重用持久性库来访问数据库?

Domain driven design 我的集成测试是否应该重用持久性库来访问数据库?,domain-driven-design,integration-testing,ddd-repositories,hexagonal-architecture,Domain Driven Design,Integration Testing,Ddd Repositories,Hexagonal Architecture,我有一个DDD.IdentityAccess.Domain的实现,它包含IUserRepository抽象。还有另一个dll->DDD.IdentityAccess.Persistence.Sql,其中包含IUserRepository抽象的实现。现在,我想测试我的IdentityAccess->Api->DomainLogic->Database。让我们使用一个“创建用户”用例。我通过我的httpClient调用'CreateUser',然后我想查询db以检查用户是否实际添加到db中。我在re

我有一个DDD.IdentityAccess.Domain的实现,它包含IUserRepository抽象。还有另一个dll->DDD.IdentityAccess.Persistence.Sql,其中包含IUserRepository抽象的实现。现在,我想测试我的IdentityAccess->Api->DomainLogic->Database。让我们使用一个“创建用户”用例。我通过我的httpClient调用'CreateUser',然后我想查询db以检查用户是否实际添加到db中。我在rest api上没有“user/id”操作,因此唯一的选择是使用DDD.IdentityAccess.Persistence.Sql,但它会带来对DDD.IdentityAccess.Domain的依赖性。我应该重用此dll,还是创建另一个与域无关的DAL?

这与域驱动设计的关系比与组织测试设置的关系小

集成测试的编写成本很高,但通过显示多个组件按预期协同工作,可以带来巨大的价值。这是一种权衡

也就是说,如果我理解正确,您的问题是您是应该模拟sql数据访问对象,还是一直到数据库,执行相同的sql语句

这里没有正确或错误的答案。如果重点是测试业务逻辑,那么就集中精力测试域和模拟数据库访问层


如果重点是测试简单的保存操作是否自上而下工作,那么不要模仿。(当然,要使用测试数据库。)

这与域驱动的设计关系不大,而与组织测试设置关系不大

集成测试的编写成本很高,但通过显示多个组件按预期协同工作,可以带来巨大的价值。这是一种权衡

也就是说,如果我理解正确,您的问题是您是应该模拟sql数据访问对象,还是一直到数据库,执行相同的sql语句

这里没有正确或错误的答案。如果重点是测试业务逻辑,那么就集中精力测试域和模拟数据库访问层


如果重点是测试简单的保存操作是否自上而下工作,那么不要模仿。(但当然要使用测试数据库。)

不,我的问题是,我是应该在集成测试项目中重用持久性库,还是创建一个新的持久性库,其中包含贫血实体,以避免引用我的域类……编写一组单独的实体听起来有悖常理,尤其是对于集成测试。所以,不,你说的实体是什么意思?具有行为的域模型?因为我的持久性层有对域模型的引用,这让我不确定……实体将是可以从数据库存储和检索的域类。域类是DDD的核心(以及作为关键字添加到问题中的六边形体系结构)。因此,没有它们就很难编写任何测试。不可能有一个明确的答案,因为你应该权衡你处境中的利弊。但作为一般规则,您可以在集成测试中包括域类。对于专注于单个类的纯单元测试,您可以考虑模拟该类的依赖关系。不,我的问题是,我是否应该在集成测试项目中重用持久性库,还是创建一个新的持久性库,其中包含贫乏的实体,以避免引用我的域类……编写一组单独的实体听起来违反直觉,特别是对于集成测试。所以,不,你说的实体是什么意思?具有行为的域模型?因为我的持久性层有对域模型的引用,这让我不确定……实体将是可以从数据库存储和检索的域类。域类是DDD的核心(以及作为关键字添加到问题中的六边形体系结构)。因此,没有它们就很难编写任何测试。不可能有一个明确的答案,因为你应该权衡你处境中的利弊。但作为一般规则,您可以在集成测试中包括域类。对于专注于单个类的纯单元测试,您可以考虑模拟该类的依赖关系。真正由您决定哪种设计决策和权衡是有意义的!做你认为会帮助你成为最有效率的人的事!我明白你的意思,因为我也想过。您正在测试适配器,因此为了检查写入测试,我不会使用读取,因为它也属于适配器。您应该使用db的其他程序读取数据库,或者使用db触发器检查写入,侦听插入。Gerard Meszaros在他的书“xUnit测试模式”中也谈到了这一点,第172-173页。他提到“DBUnit”是一种测试工具,用于插入数据以测试“读取”操作,并检查数据库内容以测试“写入”操作。真正由您决定哪些类型的设计决策和权衡是有意义的!做你认为会帮助你成为最有效率的人的事!我明白你的意思,因为我也想过。您正在测试适配器,因此为了检查写入测试,我不会使用读取,因为它也属于适配器。您应该使用db的其他程序读取数据库,或者使用db触发器检查写入,侦听插入。Gerard Meszaros在他的书“xUnit测试模式”中也谈到了这一点,第172-173页。他提到“DBUnit”是一种测试工具,用于插入数据以测试“读取”操作,并检查数据库内容以测试“写入”操作。