单元测试如何查询数据?

时间:2014-01-04 17:09:00

标签: c# unit-testing

如何对一个相当简单的应用程序进行单元测试?

通过“相当简单的应用程序”理解:

  

通过ORM查询数据库(可能很复杂)并在不进行任何进一步处理的情况下显示结果的应用程序。也就是说,Linq查询返回一个简单的IEnumerable,它将显示在屏幕上。

到目前为止,我写的测试往往很慢,而且我的执行时间越来越多。如果我保留这个过程,这些测试只会在我提交代码时执行,因此我将失去单元测试的所有好处:在一分钟内突出显示错误或错误。

我试图在内存中创建一个对象图,但随着应用程序的增长,这个图变得非常复杂,并且需要花费越来越多的时间进行维护。当我插入ORM而不是对象图时,我看到我的单元测试没有预见到的错误......

就我而言,我需要一个通用解决方案,因为ORM应该是Entity Framework或nHibernate。

编辑:

我重新解释我的问题,因为它可能有点不清楚:测试这种应用程序意味着测试查询。 测试Linq查询的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

您的问题的简单答案不是单元测试数据查询。当您发现单元测试的价值时,这部分应用程序非常有限,并且大多数错误都没有显示出来。 ORM是集成测试的好地方。

要启用此功能,您的数据访问代码必须放在一个位置。根据您的应用程序,这可能是数据访问层,存储库或任何其他结构,使您可以从业务逻辑中分离数据访问。在业务逻辑部分中,您使用单元测试并使用内存解决方案模拟或替换数据访问。 您使用集成测试测试的数据访问部分。但在这里,您只需要测试是否可以插入,更新,选择或删除数据以及查询是否有效。与在单元测试中尝试完成所有测试的方式相比,这应该是可行的。

Entity Framework和nHibernate都有关于如何使用这些框架进行此类测试的教程。

答案 1 :(得分:1)

约翰尼·格拉伯的回答是类似的,但无论如何我都会加入我的意见。

要特别回答有关测试Linq查询的问题(现在仍然是我的意见,就像上面的评论一样):你不测试它们。

Linq非常简单,在项目中有很多Linq查询基本上就像使用硬编码的SQL语句一样糟糕。

因此,Linq查询应该是数据抽象层的一部分,并且该层是您测试的层。该层提供基本访问方法,主要是CRUD操作。这些操作可以使用Linq针对任何内容实现(SQL,SQLite.Net,XML,您可以命名)。

然后你应该有另一个DAL实现,它返回/生成模拟数据。这里不需要使用Linq。

然后,您可以测试,如果您的应用程序对包含模拟数据的实现起作用,这是快速的,因为它是基于内存的。 你担心这些方法的结果。

您可以不时切换到基于Linq的高效版本并运行较慢的测试。 Linq本身就有效。微软做得很好。您需要担心您的访问方法返回正确的数据。