您会将啥放入存储库类(数据访问层)的单元测试中?
Posted
技术标签:
【中文标题】您会将啥放入存储库类(数据访问层)的单元测试中?【英文标题】:What would you put into the unit test of a repository class (data access layer)?您会将什么放入存储库类(数据访问层)的单元测试中? 【发布时间】:2011-11-19 15:39:30 【问题描述】:我想为我的数据访问层编写一个单元测试,以确保一切正常。 问题是,我应该在测试中加入什么样的东西?
DAL 是一个静态的Repository
类,它隐藏底层(Fluent NHibernate)并通过IQueryable
向公众公开内容。
我想过
CRUD(创建/检索/更新/删除)操作 交易关于 DAL 是否还有其他值得测试的地方? 提前感谢您的回答!
【问题讨论】:
【参考方案1】:存储库实现通过集成测试进行测试,而不是单元测试。隔离存储库实现(模拟 ORM)几乎是不可能的。请看一下这个answer。集成测试使用真实的 ORM 结合真实或虚假(通常在内存中)数据库来执行以下操作:
保存新对象 更改 -> 保留 -> 恢复顺序 所有“查找”方法基本上是在测试以下各项的正确性:
映射(即使您使用 fluent) 标准 hql 或 sql 查询事务通常由应用层处理,而不是存储库。您可能对this 的回答感兴趣。在存储库实现中封装 IQueryable 将使您的测试更容易。
【讨论】:
为什么将这些称为“集成测试”? 因为单位意味着隔离。当您看到“单元”时,请阅读 “隔离单元”。从 NHibernate 中分离存储库实现几乎是不可能的。因此,您需要验证存储库和真实 ORM 的组合是否可以一起工作的集成测试。请看这个:***.com/questions/7110981/… 啊,是的,你是对的。我看过那篇文章,现在我明白了。 确实我想测试ORM 和存储库的组合,而不是单独的存储库。 SQLite 不会捕获外键约束,因此也需要与“真实”数据库进行集成测试【参考方案2】:-
需要测试正确的异常处理
数据库连接超时参数
存储过程调用超时参数
正确的输入参数映射。如果存储过程期望接收浮点数但
接收 int。
【讨论】:
感谢您的回答!我的数据库没有存储过程。但是您的积分仍然有效!【参考方案3】:通常在 DAL 中你没有业务逻辑,只是简单的 db 访问代码,大概 1-5 行长,所以没有太多要测试的......
如果您确定要对其进行单元测试,那么我相信 CRUD 没问题。模拟 NHibernate,提供假数据并针对该假数据进行测试;)。
希望这会有所帮助;)
【讨论】:
是的,这是普通的数据库访问,没什么特别的。尽管如此,进行单元测试还是很好的,因为:1. 证明它可以工作是很好的 2. 然后团队的其他成员可以查看它并了解如何使用 DAL。以上是关于您会将啥放入存储库类(数据访问层)的单元测试中?的主要内容,如果未能解决你的问题,请参考以下文章