代码之家  ›  专栏  ›  技术社区  ›  Arda Xi

如何对一个要与数据对话的类进行单元测试?

  •  6
  • Arda Xi  · 技术社区  · 14 年前

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

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

    4 回复  |  直到 14 年前
        1
  •  8
  •   Jon Skeet    14 年前

    不,你在写一个 使用 IRepository . 对于 实现 属于 寄存的 ,则需要根据适当的数据源进行测试。对于数据库来说,这有点痛苦——对于文件系统来说,这要稍微轻一点。

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

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

        2
  •  1
  •   Paul    14 年前

    我认为,如果您正在测试实际存在的代码或查询数据,那么您可能真的希望命中数据库。

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

    您可以设置一个测试数据库,在其中您知道数据的状态,并对此运行测试。您可能还想告诉测试它们不同于您的单元测试,并且不需要在每次签入时都运行(在nunit中,您可以用一个属性来修饰您的测试类,告诉它不要运行)

        3
  •  1
  •   Iain Galloway    14 年前

    一般来说,你不会 单元 测试任何只用于与数据源对话的代码。您可能仍然希望自动测试存储库,但根据定义,这样的测试将是集成测试。您可能不想在“第一次通过”构建过程中运行这些测试,例如,设置数据库并在自己完成后进行清理可能需要花费大量时间。

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

        4
  •  1
  •   Igor Zevaka    14 年前

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

    因此,如果从数据库中读取数据,可以模拟sqlconnection和sqlcommand,并确保对这些类调用正确的方法。如果您正在写入流,则可以模拟该流,并确保刷新该流并对其进行处理(例如)。

    推荐文章