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

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

DAL是使用NHibernate实现的,而DB是Microsoft SQL Server。不幸的是,某些DAO必须使用普通的ADO.Net来实现。甚至更糟的是,某些DAO必须是存储过程的包装。

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

我的问题如下:


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

最佳答案

围绕DAO进行测试总是很棘手,但是如果您在这一层中有逻辑,那么它绝对是单元测试的理想选择。

过去我发现使用内存数据库进行这种类型的测试非常有效-涉及一定数量的设置成本(即,在测试中配置您自己的数据库模式的连接和部署)但是一旦完成,他们往往会表现得很好。 SQLite似乎对您来说是一个不错的选择,对于use with NHibernate来说似乎很简单,并且还有一个SQLite provider for ADO.net

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

最后一点-如果您的应用程序中确实有包含任何非平凡逻辑的存储过程,那么围绕它们进行一些集成测试可能是值得的(也许每个存储proc都有一个测试,它可以测试DAO和部署在生产环境中的proc)数据库)。尽管创建和维护它们会有些痛苦,但我发现它们在过去非常值得-由于开发人员很少充分测试存储proc更改,因此对存储过程的更改通常是bug的来源。

关于.net - 数据测试层的单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17511088/

10-11 21:41
查看更多