繁体   English   中英

你如何对一个与数据交流的类进行单元测试?

[英]How do you unit test a class that's meant to talk to data?

我有一些存储库类,用于与IRepository接口派生的不同类型的数据进行通信。

在实现中,代码与数据源对话,这是XML文件或数据库的目录,甚至只是缓存。 是否有可能对这些实现进行可靠的单元测试? 我没有看到模拟实现工作,因为那时我只测试模拟代码而不是实际代码。

不,当你编写一个使用 IRepository的类时,你会使用mock。 对于IRepository实现 ,您需要针对相应的数据源进行测试。 对于数据库来说,这有点痛苦 - 对于文件系统来说,稍微不那么容易。

在可能的情况下,如果您可以根据流或读者来表达您的实现,您将使您的生活更轻松:对实现的这些部分的测试可能违反内存中的数据源,或来自测试程序集中的资源的流。 当然,您可能需要进行一些真实数据库或文件系统的测试,但希望更少。

无论你是否称这种测试“单元”测试都是你如何定义单元测试的问题; 我个人对所涉及的名字并不太在意,但我确实关心进行测试。 特别是对于数据库而言,这些可能会有些痛苦(特别是如果您希望能够并行运行测试) - 但根据我的经验,它们也可能非常有价值。

我认为如果您正在测试实际持久存储或查询数据的代码,您可能实际上想要访问数据库。

这些是集成测试而不是单元测试。

您可以设置一个测试数据库,在该数据库中,您可以了解数据的状态,并针对此运行测试。 您可能还想告诉测试它们与您的单元测试不同,并且不需要在每次检入时运行(在nUnit中,您可以使用属性来装饰您的测试类,告诉它不要运行)

从广义上讲,您不会对任何唯一目的是与数据源进行通信的代码进行单元测试。 您可能仍希望自动测试存储库,但根据定义,此类测试将是集成测试。 您可能不希望将这些测试作为“第一次通过”构建的一部分来运行,例如设置数据库并在自己花费很多时间之后进行清理。

如果您的存储库有其他职责(例如,实现工作单元模式),那么您可能需要单独对它们进行单元测试。

在IRepository实现的某些时候,您将使用第三方API,它实际上将读/写数据库/文件/ xml。 您要做的是模拟这些API,以确保您的代码以正确的顺序调用正确的API。

因此,如果您正在从数据库中读取数据,则可以模拟SqlConnection和SqlCommand,并确保在这些类上调用正确的方法。 如果您正在写入流,则可以模拟流并确保刷新并处理它(例如)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM