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

时间:2010-05-02 11:02:45

标签: c# unit-testing tdd mstest testing-strategies

我有一些存储库类,用于与来自IRepository接口的不同类型的数据进行对话。

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

4 个答案:

答案 0 :(得分:8)

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

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

您是否将此类测试称为“单元”测试,这取决于您如何定义单元测试;我个人对所涉及的名字并不太在意,但我关心进行测试。特别是对于数据库来说,这些可能有点痛苦(特别是如果你想能够并行运行测试) - 但根据我的经验,它们也可能非常有价值。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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