单元测试数据访问层

时间:2013-07-07 09:59:39

标签: .net sql-server unit-testing nhibernate testing

我知道这个问题之前已被问过很多次了,但我仍然没有找到一个好的答案,而且我对这个问题的看法略有不同。

我正在寻找一种彻底的单元测试数据访问层的好方法,但如果可能的话,可以原子地进行。我不想使用真正的数据库(或克隆),因为它将是一个集成测试,我希望我的测试保持尽可能轻量级和简单。

DAL使用NHibernate实现,数据库是Microsoft SQL Server。遗憾的是,一些DAO必须使用普通的旧ADO.Net来实现。更糟糕的是,一些DAO必须成为存储过程的包装。

基本上,我想测试的是,NHibernate映射是有意义的,DAO从根本上起作用。我想基于我的NHibernate映射在内存中创建一个DB,模拟所有必需的存储过程,然后围绕这个数据库运行我的单元测试。使用我正在测试的DAO插入和查询内存数据库中的“模拟”。

我的问题如下:

  1. 这是一个好方法吗?
  2. 有没有人有这种方法的经验,可以分享见解?
  3. 是否有一些框架或库可以帮助我在内存数据库中创建模拟?
  4. 如何构建这些测试以适用于基于NHibernate的Dao和基于ADO.Net的Dao?
  5. 如何为存储过程创建模拟?

1 个答案:

答案 0 :(得分:1)

围绕DAO进行测试总是很棘手,但如果你在这一层内部有逻辑,那么它肯定是单元测试的理想选择。

我在过去发现使用内存数据库进行此类测试非常有效 - 涉及一定的设置成本(即配置连接和部署自己的数据库模式作为测试)但是一旦完成,他们往往工作得很好。 SQLite看起来对你来说可能是一个不错的选择,看起来use with NHibernate非常简单,而且还有一个SQLite provider for ADO.net

问题SQLite的一个问题是它不支持存储过程。我认为你最好的选择是创建封装存储过程调用的独立类,并将这些类型的对象注入到DAO中。这样,您可以使用标准对象模拟来模拟存储过程调用。

最后要注意的是 - 如果你的应用程序中存在包含任何非平凡逻辑的存储过程,那么对它们进行一些集成测试可能是值得的(也许每个存储过程执行一次测试来执行DAO和部署的过程)像数据库这样的生产。虽然创建和维护这些会有点痛苦,但我发现这些在过去非常值得 - 存储过程的更改通常是错误的根源,因为开发人员很少彻底测试存储过程变更。