Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对数据进行单元测试查询?_C#_Unit Testing - Fatal编程技术网

C# 如何对数据进行单元测试查询?

C# 如何对数据进行单元测试查询?,c#,unit-testing,C#,Unit Testing,如何对一个相当简单的应用程序进行单元测试 通过“相当简单的应用”了解: 通过ORM查询数据库(可能很复杂)并显示结果而无需进一步处理的应用程序。也就是说,Linq查询返回一个简单的IEnumerable,它将显示在屏幕上 到目前为止,我正在编写的测试往往很慢,我会越来越多地延迟它们的执行。如果我保持这个过程,这些测试将只在我提交代码时执行,因此我将失去单元测试的所有好处:在一分钟内突出显示bug或错误 我试图在内存中创建一个对象图,但随着应用程序的增长,这个图变得非常复杂,需要花费越来越多的时间

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

通过“相当简单的应用”了解:

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

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

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

在我的例子中,我需要一个通用的解决方案,因为ORM应该是实体框架或nHibernate

编辑:


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

问题的简单答案不是单元测试数据查询。正如您所发现的,单元测试的价值在应用程序的这一部分是非常有限的,并且大多数bug都没有出现。ORM是集成测试的好地方

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


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

约翰尼·格雷勃的答案与此相似,但出于几点意见,我还是要补充我的答案

为了明确回答您关于测试Linq查询的问题(尽管如此,这是我的观点,如上面的评论):您不测试它们

虽然Linq很好而且很简单,但在一个项目中有很多Linq查询基本上和硬编码SQL语句一样糟糕

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

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

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

您可以不时切换到基于Linq的生产版本,并运行较慢的测试。
Linq本身也能工作。微软做得很好。您需要担心您的访问方法是否会返回正确的数据。

这一点完全不清楚。你到底想测试什么?为何有样品吗。。。这是基于观点的,所以没有答案。但我相信EF和nHibernate是有效的,不需要测试。我所做的:我使用服务实现中的任何ORM。然后,该服务由一个门面类使用,门面类执行额外的处理/验证。我有一个版本的服务使用ORM,另一个版本使用基于内存的数据。然后,我经常使用基于内存的模拟服务测试外观。很少使用基于ORM的服务。这可以防止基于数据库的ORM导致的执行缓慢。这是一个非常广泛的问题。也许你可以在我编辑我的问题以澄清它的时候问它。