我希望在我的单元测试项目中引用我的数据库文件。这是一个ASP.NET MVC应用程序。
请注意:我知道我不应该在我的单元测试中访问数据库,但这是为了快速修复我刚才需要通过的一个测试。
在下一个里程碑之后,我将嘲笑数据库访问方法等。
所以这是我的mvc app web config中的连接字符串和单元测试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.
在我看来,连接字符串是错误的,但我不确定如何正确设置路径。我试过添加\ .. \ ..和目录名等。
答案 0 :(得分:4)
MSTest将在每次测试运行时在完全不同的文件夹中运行您的单元测试程序集。我们的想法是,每次运行都是与之前和之后的运行完全隔离的情况。告诉它将数据文件与应用程序的其余部分一起复制实际上是一种痛苦。您需要右键单击解决方案(而不是项目),选择添加,创建新的测试运行配置。然后,您需要编辑测试运行配置并指定将哪些文件复制到测试执行文件夹。解决方案目录中应该有一个名为TestResults的兄弟目录,其中包含用于每次测试运行的文件夹。
答案 1 :(得分:2)
你可以像这样引用localdb:
<add name="DefaultConnection"
connectionString="Server=(localdb)\v11.0;Database=WebPortalDb" providerName="System.Data.SqlClient"/>
其中WebPortalDb是您的数据库名称。
答案 2 :(得分:1)
评论克雷格的答案:为单元测试执行部署额外的数据文件应该不是一件痛苦的事。您可以在类或方法级别使用DeploymentItemAttribute(Microsoft.VisualStudio.TestTools.UnitTesting)来指定在运行这些测试之前需要复制哪些文件。
答案 3 :(得分:0)
最好的答案是不要使用某些单元测试连接到数据库,而是模拟数据库。但是,您可能需要重构现有的MVC代码以达到可以模拟数据库依赖关系的程度,并且在代码包含在某些测试中之前,您不应该重构。因此,在这种情况下,是的 - 您可能需要将测试项目连接到数据库,至少在一段时间内,直到您将所有内容分离到足以启用模拟。
所以在我的实例中我使用的是ASP.Net MVC 5.这意味着我可以通过右键单击解决方案文件,将必要的Entity Framework配置添加到Unit Test Project的app.config文件中,管理NuGet for Solution,并将EF添加到测试项目中。
然后从MVC项目的主Web.config文件中添加连接字符串 NEARLY 工作,使用我必须删除字符串的最后部分的次要调整:< / p>
AttachDbFilename=|DataDirectory|<<MY_DATABASE_NAME_AND_ID>>.mdf
正如我所说,创造单位&#39;连接到数据库的测试不是可行的方法,因此这只是一个临时措施。但是代码需要重构才能使它成为一个可模拟的状态,并且(如果没有至少一些测试来重构的那些重构因为没有破坏一切都是为了瘀伤而进行重组。