【问题标题】:Connection string in unit test project to reference database in app_data folder单元测试项目中的连接字符串到 app_data 文件夹中的参考数据库
【发布时间】:2009-07-22 17:25:17
【问题描述】:

我希望在我的单元测试项目中引用我的数据库文件。这是一个 ASP.NET MVC 应用程序。

请注意:我知道我不应该在我的单元测试中访问数据库,但这是为了快速修复我需要通过的一个测试。

在下一个里程碑之后,我将模拟数据库访问方法等。

这是我的 mvc 应用程序 web 配置和单元测试 ap.config 文件中的连接字符串

<add name="DBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB.MDF;Integrated Security=True;User Instance=True"
  providerName="System.Data.SqlClient" />

当我运行测试时出现错误:

Test method
ED.Tests.Controllers.CandidateControllerTest.PersonalDetailsStepPostShouldRedisplayIfNoSurnameSupplied 
threw exception:  System.Data.SqlClient.SqlException: 
An attempt to attach an auto-named database for file C:\Users\Desktop\ED\TestResults\LAPTOP-D 2009-07-22 18_16_20\Out\DB.MDF failed. 
A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

在我看来,连接字符串是错误的,但我不确定如何正确设置路径。我尝试添加 \..\.. 和目录名称等。

【问题讨论】:

  • 这是VS2008自带的默认所以我觉得是的。

标签: asp.net-mvc unit-testing connection-string


【解决方案1】:

您可以像这样简单地引用 localdb:

<add name="DefaultConnection" 
connectionString="Server=(localdb)\v11.0;Database=WebPortalDb" providerName="System.Data.SqlClient"/>

其中 WebPortalDb 是您的数据库名称。

【讨论】:

    【解决方案2】:

    评论 Craig 的回答:为单元测试执行部署额外的数据文件应该不会很痛苦。您可以在类或方法级别使用 DeploymentItemAttribute (Microsoft.VisualStudio.TestTools.UnitTesting) 来指定在运行这些测试之前需要复制哪些文件。

    【讨论】:

    • 感谢您为我指明方向。它实际上应该是:[DeploymentItem("connectionstrings.config")]
    【解决方案3】:

    MSTest 将在每次测试运行时在完全不同的文件夹中运行您的单元测试程序集。这个想法是每次运行都是与先前和后续运行完全隔离的案例。告诉它与应用程序的其余部分一起复制数据文件实际上是一种痛苦。您需要右键单击您的解决方案(不是您的项目),选择添加,创建一个新的测试运行配置。然后您需要编辑测试运行配置并指定将哪些文件复制到测试执行文件夹。您的解决方案目录应该有一个名为 TestResults 的同级目录,其中包含用于每次测试运行的文件夹。

    【讨论】:

    • 是的,我注意到不同的输出文件夹。谢谢,这让我很开心,现在该睡觉了;)
    【解决方案4】:

    最好的答案是根本不使用一些单元测试连接到数据库,而是模拟数据库。但是,您可能需要重构现有的 MVC 代码以达到可以模拟数据库依赖项的程度,并且在您的代码包含在某些测试中之前,您永远不应该重构。所以在那种情况下,是的 - 您可能需要将您的测试项目连接到数据库,至少一段时间,直到您将所有内容解耦到足以启用模拟为止。

    因此,在我的实例中,我使用的是 ASP.Net MVC 5。这意味着我只需右键单击解决方案文件,管理 NuGet 以获取解决方案,即可将必要的实体框架配置添加到单元测试项目的 app.config 文件中,并将 EF 添加到测试项目中。

    然后从 MVC 项目的主 Web.config 文件中添加连接字符串 NEARLY 工作,我不得不删除字符串的最后部分:

    AttachDbFilename=|DataDirectory|<<MY_DATABASE_NAME_AND_ID>>.mdf
    

    正如我所说,创建连接到数据库的“单元”测试不是可行的方法,因此这只是一种临时措施。但是代码需要重构以使其达到可模拟的状态,并且(s)在没有至少进行几次测试以证明重构并没有破坏一切的情况下进行重构的人正在苦苦挣扎。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2020-06-04
      • 1970-01-01
      相关资源
      最近更新 更多