【问题标题】:How would you go about swapping a connection string to access a test database for unit testing?您将如何交换连接字符串以访问测试数据库以进行单元测试?
【发布时间】:2009-06-22 13:15:53
【问题描述】:

我已经设置了一个测试数据库来开始对我最近添加到的应用程序进行单元测试。这是一个 3 层设计(表示层、BOL 和 DAL),这是我第一次编写单元测试。

我决定从 BOL 开始,我认为最好的方法是将 ConnectionString(它作为共享字符串传递)换成指向我的新测试数据库的连接字符串。但是,我不想更改任何生产代码。我只是希望在单元测试期间以某种方式将应用程序重定向到测试数据库。我该怎么做呢?

【问题讨论】:

  • 您还应该考虑将“安装资格”测试作为生产部署的一部分。快速检查生产数据库是否与您测试的数据库相似。

标签: asp.net sql vb.net unit-testing n-tier-architecture


【解决方案1】:

我通常做的是创建一个配置部分,其中包含确定要使用哪个连接字符串的功能。

这是一个基本的例子:

static ConfigurationSettings
{
     static String ConnectionString
     {
        get
        {
           var result = "TESTCONNECTIONSTRING";
           if (ConfigurationManager.ConnectionStrings["SOMEKEY"] != null)
               result = ConfigurationManager.ConnectionStrings["SOMEKEY"];
           return result;
     }
}

这样,我就不用担心如何连接系统了,你也可以在你的测试中重写这个行为,通过添加一个setter来完成你想要的。

我之所以不走多配置文件路线,是因为我在测试套件(例如 NUnit 测试运行程序)中运行时无法使用配置文件。

【讨论】:

  • 这个答案的某些部分很有意义,但我对您发布的实际代码不太清楚。这对我来说没有多大意义。
  • @Chris 我在 C# 中发布了它,这是为什么呢?如果您愿意,我可以将我的答案编辑到 VB.NET 中。还是其他地方的混乱?
  • 这不是因为它在 C# 中。有两件事让我失望。第一,您粘贴的代码将驻留在哪里?配置文件就是一个简单的xml文件,那么如何将上述代码之类的逻辑放入其中呢?第二个是你的 if 语句。根据我是在运行单元测试还是只是运行代码,这将如何为我提供不同的连接字符串?感谢您的跟进。
  • @Chris 1. 代码应该放在应用程序的某个配置命名空间/项目中。 2. 该属性在运行时根据您是否有配置文件(web.config 或 app.config)为您提供不同的连接字符串。对于单元测试,您将没有 web.config 或 app.config(至少没有您可以操作的),因此将使用硬编码字符串。
【解决方案2】:

您的连接字符串是否来自配置文件?您可以在单元测试中设置匹配的配置吗?

【讨论】:

  • 是的。我想这可能是可能的,我不确定我会怎么做。谢谢!
【解决方案3】:

您可能很快就会了解到,出于多种原因,静态/共享代码在单元测试中被视为邪恶。其中一个原因是在单元测试期间很难更改值。

Dependencies 显式传递给您的被测系统 (SUT) 是一个更好的主意 - 最好在构造函数中。在您的情况下,您应该通过其构造函数将连接字符串传递给 SUT。

更好的方法是抽象出接口后面的数据访问层,并将该接口的实例传递给 SUT。

我写过一些关于 Imperative Configuration 的文章,但总的来说,您应该阅读 Roy Osherove 的书 The Art of Unit Testing - 它涉及很多此类问题。

【讨论】:

    【解决方案4】:

    将连接字符串保存在配置文件中是一种常见的做法。如果你这样做,那么只需在不同的上下文中使用不同的配置文件。

    如果您不这样做,也有可能(但您可能必须更改生产代码)。让连接字符串通过构造函数或设置器注入。然后,在生产中,您使用生产连接字符串;在测试中,您可以连接到您的测试数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      相关资源
      最近更新 更多