您会将啥放入存储库类(数据访问层)的单元测试中?

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。

以上是关于您会将啥放入存储库类(数据访问层)的单元测试中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中对 DAO 应用单元测试

如何使用 C# 为 Snowflake 编写 MS 单元测试

单元测试数据访问层的方法

数据访问层的单元测试

我应该使用 oauth2 jwt 授权将啥存储到数据库中?

我应该对数据访问层进行单元测试吗?这是一个好习惯以及如何去做?