一个仓储类(数据访问层)的单元测试应该包括哪些内容?

4
我想为我的数据访问层编写单元测试,以确保其中的所有内容正常工作。问题是,我应该在测试中放什么样的东西?
这个DAL是一个静态的“Repository”类,它隐藏了底层(Fluent NHibernate)并通过“IQueryable”向公共接口提供了一些操作。
我考虑过:
·CRUD(Create/Retrieve/Update/Delete)操作
·事务
除了上述内容之外,还有哪些值得测试的DAL内容呢?
谢谢您的回答!
3个回答

12

仓储库实现使用集成测试进行测试,而不是单元测试。隔离仓储库实现(模拟ORM)几乎是不可能的。请参阅这个答案。集成测试使用真实ORM结合真实或虚拟(通常是内存中的)数据库执行以下操作:

  • 保存新对象
  • 更改 -> 持久化 -> 恢复序列
  • 所有“查找”方法

基本上您正在测试以下内容的正确性:

  • 映射(即使您使用流畅的方式)
  • 条件
  • hql或sql查询

事务通常由应用程序层处理,而不是仓储库。您可能会对这个答案感兴趣。将IQueryable封装在仓储库实现中将使您的测试更加容易。


你为什么要称它们为“集成测试”? - Venemo
因为“unit”意味着“隔离”。当您看到“unit”时,请阅读“隔离单元”。将存储库实现与NHibernate隔离几乎是不可能的。因此,您需要进行集成测试以验证存储库和真实ORM的组合是否能够一起工作。请查看此链接:https://dev59.com/DGw05IYBdhLWcg3wpTcV#7111748 - Dmitry
啊,是的,你说得对。我已经阅读了那篇文章,现在我明白了。 - Venemo
我确实想测试ORM和存储库的组合,而不是仅测试存储库。 - Venemo
SQLite不会捕获外键约束,因此还需要与“真实”的数据库进行集成测试。 - Berryl
显示剩余2条评论

1
  1. 需要测试正确的异常处理
  2. 数据库连接的超时参数
  3. 存储过程调用的超时参数
  4. 适当的输入参数映射。如果存储过程期望接收浮点数但接收到整数。

谢谢你的回答!我的数据库没有存储过程。但是你的观点仍然有效! - Venemo

1
通常在数据访问层(DAL)中,您没有业务逻辑,只有纯粹的数据库访问代码,可能只有1-5行长,因此没有太多需要测试的内容...
如果您确定要对其进行单元测试,那么我认为CRUD是可以的。模拟NHibernate,提供虚假数据并针对该虚假数据进行测试;)
希望这可以帮助;)

是的,这只是普通的数据库访问,没有什么花哨的东西。不过,编写单元测试会很有好处,因为:1. 这可以证明它能正常工作;2. 团队中的其他成员可以查看它并了解如何使用数据访问层(DAL)。 - Venemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接