【问题标题】:Testing - Connection string is missing测试 - 缺少连接字符串
【发布时间】:2012-02-27 19:40:21
【问题描述】:

Visual Studio 为我创建了一个基于方法的单元测试项目(右键添加测试)。当我尝试访问数据库时,出现异常。运行此代码以查看我的连接是什么:

ConnectionStringSettings connStringSettings = ConfigurationManager.
    ConnectionStrings["myConnectionString"];

但是,connStringSettings 为空。经检查,ConnectionStrings 集合的计数只有一个。它似乎没有从我的 web.config 中读取。

我的 DAL 是孤立的,无法通过代码设置其连接字符串。它的连接字符串是这样设置的:

set
{
    value = System.Configuration.ConfigurationManager.
        ConnectionStrings["myConnectionString"].ConnectionString;
}

我该如何解决这个问题?

【问题讨论】:

  • 如果你访问数据库,你不是单元测试,你是集成测试。对于单元测试,您应该模拟您的数据访问层,此时连接字符串方面是无关紧要的。
  • @DBM - 好点。我更新了标签和标题。

标签: c# visual-studio-2010 web-config connection-string integration-testing


【解决方案1】:

App.config 文件添加到您的单元测试项目并复制Web.config 中的连接字符串。

更新:更好的解决方案

虽然添加配置可以解决眼前的问题,但它仍然会根据实际的数据库连接导致单元测试,这不是很好。解决此问题的更好方法是完全模拟 DAL 并将其传递给正在使用它的服务。

Microsoft 对此提供了一些指导 here。设置需要更多时间,但它可以让测试更加包含和完整。

我已经成功使用MockQueryable 在测试数据上下文中模拟单个表。

【讨论】:

  • 这仍然是唯一可行的解​​决方案吗(到目前为止还没有找到其他的说法......但我还没有找到一个整体)。如果我可以连接字符串怎么办?然后我必须确保它在测试项目中也发生了变化?
  • 是的 - 抱歉,但如果您的连接字符串已经被测试类自动包装,您将无能为力。如果您可以使用客户连接字符串来实例化 DAL 构造函数的重载,那么您可以将字符串放入该构造函数中。不幸的是,如果您必须更改连接字符串,则必须在两个项目中手动进行。不过,最终的答案是,单元测试确实不应该访问数据库,因此从技术上讲,那里根本不需要连接字符串。
  • 如果您不打算访问数据库,那么如何测试您的查询是否正常工作?
  • 本质上,您需要模拟数据上下文。一种方法是从 moq 传入 Mock 对象,但如果查询变得复杂,这可能会变得困难。对于困难的查询,我的偏好是使用假数据上下文包装器完全模拟数据上下文。对此有一些堆栈问题,但其中一个链接在这里:blogs.msdn.com/b/mattwar/archive/2008/05/04/…
  • 2015 年 12 月仍然是答案
【解决方案2】:

太好了,这对我有用。我在单元测试项目下添加了 App.config 文件。但是请确保我们应该遵循 synatx 否则它会抛出异常。

<connectionStrings>

    <add name="test" connectionString="" providerName="System.Data.SqlClient" />

    <add name="db" connectionString=""" providerName="System.Data.SqlClient"/>

</connectionStrings>

【讨论】:

    【解决方案3】:

    在单元测试的 app.config 文件中添加连接字符串。单元测试项目将无法访问您的 Web 项目的 Web 配置。

    【讨论】:

      【解决方案4】:

      另一种解决方案是进入解决方案属性页(solution->properties)

      启动项目 - 检查单个启动项目是否具有配置。

      选择,好的 - 完成。

      【讨论】: