【问题标题】:How to test a method that queries a database without actually performing the query?如何在不实际执行查询的情况下测试查询数据库的方法?
【发布时间】:2014-09-29 07:56:14
【问题描述】:

我正在尝试编写一个单元测试,它将针对从方法返回的字符串执行检查。该字符串是实体的一部分,应该通过调用数据库来生成。我可以轻松地存根此类实体,但我不知道如何省略对数据库的调用,因为它是方法的一部分。

方法如下:

private string GetDescriptionForRelationEntry(string relAttrId, string client)
        {
            // here we are querying the database
            var relationEntities = new EntityDatabaseQuery<AttributeEntryEntity>();

            // the rest of the method
        }

需要执行指定为the rest of the method 的部分,因为我必须获取字符串结果才能执行必要的检查。所以,基本上,我只需要“伪造”一行代码。

现在我不能说允许对 SUT 类进行多广泛的修改,因此我不会将此问题限制为任何特定的解决方案。任何帮助将不胜感激。

【问题讨论】:

    标签: c# database unit-testing


    【解决方案1】:

    通常,可测试类是某个接口的实现或某个抽象类的派生类。

    因此,您可以使用控制反转容器框架,如 Castle Windsor、Ninject 或任何您可能喜欢的框架,并提供整个界面的实现它不会命中数据库,但会返回一个测试查询结果。

    【讨论】:

      【解决方案2】:

      您可以简单地创建一个模拟方法来表示您的数据库结果 使用此链接了解更多详情:http://msdn.microsoft.com/en-us/library/ff650441.aspx

      【讨论】:

      • 我不确定这对我有什么帮助,因为我需要执行该方法的第二部分(未在 sn-p 中显示)。我将编辑我的帖子以使其清楚。
      【解决方案3】:

      我建议您查看一个可以将数据库包装在内存中的解决方案。例如有the Effort library

      Effort 是一个强大的工具,可以方便地创建 基于实体框架的应用程序的自动化测试。它是 基本上是一个执行所有数据操作的 ADO.NET 提供程序 一个轻量级的进程内主内存数据库,而不是传统的 外部数据库。它也提供了一些直观的帮助方法 使用现有的 ObjectContext 或 DbContext 类。对现有代码的简单添加可能就足够了 创建可以在不存在的情况下运行的数据驱动测试 外部数据库。

      我在this answer 中解释了我是如何使用它的:它是用于实体框架的,但我认为在你的情况下可以使用相同的行为。

      【讨论】:

        【解决方案4】:

        大多数模拟框架要求您更改解决方案的架构、创建和实现接口以及动态加载实现。

        但是,您也可以使用 Microsoft Fakes,无需更改您的应用程序。假货随 Visual Studio 一起提供,因此您无需下载或安装任何东西。

        欲了解更多信息,请参阅http://msdn.microsoft.com/en-us/library/hh549175.aspx

        Microsoft Fakes 通过用存根或填充程序替换应用程序的其他部分来帮助您隔离正在测试的代码。这些是您的测试控制下的小段代码。

        【讨论】:

          猜你喜欢
          • 2019-05-08
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2018-01-06
          • 1970-01-01
          • 2020-06-23
          • 2012-05-02
          • 2015-03-13
          相关资源
          最近更新 更多