测试数据访问持久性方法

时间:2008-12-24 06:46:57

标签: unit-testing tdd data-access-layer

只是想知道是否有人对如何测试数据访问方法有任何想法。我发现测试检索数据访问方法要容易得多,因为我可以模拟ExecuteReader并返回一个填充的dataTable.CreateDataReader()。通过这样做,我可以测试,如果返回结果集,我的对象是否正确填充。

但是我如何将其转换为我的持久化方法(即添加,更新,删除等)。我想测试的是它是否正确填充命令参数等。

有什么想法吗? 干杯

3 个答案:

答案 0 :(得分:1)

模拟是要走的路。使用Moq之类的东西,您可以为数据访问类提供模拟连接(例如IDbConnection),并测试连接创建的命令是否正确设置了参数。

我前段时间写了一篇博客文章(参见here),其中介绍了模拟对IDbCommand.CreateParameter的连续调用的方法。设置模拟参数后,可以验证其Value和ParameterName属性是否已设置。

答案 1 :(得分:1)

我们使用内存中的db(hsql)进行单元测试。设置启动一个事务,拆解将其回滚。然后你总是知道单元测试中db的状态。

答案 2 :(得分:1)

对于我们的o / r映射器框架LLBLGen Pro,我们使用专用数据库进行测试,并为每组功能使用不同的测试项目。因此,我们有一个特殊的插入/更新数据库,例如,一个用于测试继承相关操作的特殊数据库,一个用于大型集合的特殊数据库,一个用于获取的特殊数据库。最重要的是,我们在不同的项目中分离了单元测试:面向提取,面向linq提供者,面向插入/更新/删除,面向内存的东西等。

这样,测试是可维护的,不会影响彼此。通过特殊的数据库,我们知道会发生什么以及该做些什么。

当然,这还取决于你对持久性逻辑测试的意思:如果你想像我们一样测试框架级例程,那么mocking就是真正没有用的东西:你想测试真正的交易情景包括大多数(如果不是全部)情况。如果您真的在讨论使用框架级代码(例如您的存储库代码)测试您的代码,那么只要所使用的框架当然没有错误,模拟就可以提供帮助。 :)