0

假设我正在开发一个数据库应用程序,并且我有许多实体类,即客户、订单、产品等。我想为这些(真实的和模拟的)开发存储库,但我不想复制代码所以我创建一个基本实体类和一个包含我的 CRUD 代码的存储库泛型。我的问题是,在“适当的”TDD 环境中,我将如何开发它?

我的第一直觉是从一个实体(例如客户)开始,然后为每个 CRUD 任务完成 TDD 循环,然后当我写完大部分内容时,从另一个实体开始,依此类推。但是,如果我正确地设计了我的架构,那么在我为所有其他实体编写测试之前,我就会为所有其他实体提供有效的 CRUD 支持。我对“好”TDD 的印象是,您只编写失败的测试,然后为每个测试编写代码以使其通过。

仅针对其实现的通用部分测试单个实体是一种不好的形式吗?泛型通常如何使用 TDD 开发?

4

2 回答 2

2

在之前的项目中,我们做了以下工作:

  • 从一个实体开始并使用 TDD 为它实现一个存储库
  • 使用临时复制粘贴的测试添加另一个实体 + 存储库
  • 现在,您的两个实体和两个存储库之间存在重复,但是绿色测试
  • 进行重构以提取实体基类并确保所有测试都通过
  • 进行另一次重构以提取引用实体基类的通用存储库实现,并再次确保所有测试通过
  • 您现在拥有所有通过的测试和一个通用存储库,但测试中有重复

你现在有一个选择:

  • 从一个实体的测试类中删除临时复制粘贴的测试,但为另一个实体保留测试

或者

  • 为包含通用存储库的测试的测试类提取一个超类,以便它们为每个实体类型运行一次。即,如果您对该测试进行SelectById了测试,则只需从公共基类继承即可为每种实体类型运行一次。

如果您使用第二种方法,您知道您对所有实体都有有效的映射/CRUD 操作,但是测试套件需要更长的时间来执行。

于 2013-04-30T12:07:30.183 回答
0

没有“适当的”TDD 环境之类的东西。red-green-refactor 过程本身有许多可能的样式,TDD 没有定义如何组合这些小循环来获得完全实现的系统的方法。

在您的情况下,我想您可以连续实现 2 个存储库,意识到存在重复代码并重构通用性,将现有测试保留为测试工具。Entity或者,从一开始就选择受类型约束的通用存储库。Entity只要存储库不依赖于实体特定的行为,您就可以在测试中使用假的子类。

于 2013-04-30T09:40:22.010 回答