如何在Visual Studio 2012和Entity Framework 5中为LocalDb设置unit testing

我们有一个使用entity framework5的Visual Studio 2012 ASP.NET MVC项目。

有一些unit testing依赖于数据库。 在testing项目中设置app.config文件以使用中央SQL Server数据库可以正常工作。

但是,使用LocalDb会更好,因此每个开发人员在运行testing时都有自己的数据库。 尤其是因为我们希望在运行时将testing设置为DropCreateDatabaseAlways

但是,我无法使设置工作。 如果我在app.config中试试这个:

 <add name="TestDb" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=unittestdb; Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\unittestdb.mdf" providerName="System.Data.SqlClient" /> 

我得到:

System.Data.SqlClient.SqlException:发生文件激活错误。 物理文件名'\ unittestdb.mdf'可能不正确。 诊断并更正其他错误,然后重试该操作。 CREATE DATABASE失败。 列出的某些文件名不能被创build。 检查相关的错误。

这听起来像是想要mdf文件已经存在,这似乎很奇怪,因为它正在尝试创build数据库。 手动创build一个mdf文件不会改变错误信息。

尝试:

 AppDomain.CurrentDomain.SetData( "DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "")); 

这将在/bin/Debug/yourdbname.mdf上创buildDb文件

我会用:

 // Declare this property - this is set by MSTest public TestContext TestContext { get; set; } // In test initialization - note the signature should be exactly this // A static void method with one argument of type TestContext [ClassInitialize] public static void SetUp(TestContext context) { AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(context.TestDeploymentDir, string.Empty)); } 

你可以使用AppDomain.CurrentDomain.BaseDirectory ,而不是使用: context.TestDeploymentDir

请记住,对于testing项目:

 AttachDBFilename = | DataDirectory目录|

意味着它将在你的output / bin / debug文件夹中查找unit testing,而不是在你的web / production / app中的App_Data文件夹。

您需要做两件事1.将数据库文件移出您的App_Data文件夹到您的testing应用程序的根目录。 2.突出显示数据库,以便在Visual Studio中获得属性窗口。 将构build操作设置为“内容”,以便在运行项目时将其复制到输出文件夹。

瞧。

我build议使用这个代码(基于Jupaol的答案):

 [ClassInitialize] public static void SetUp(TestContext context) { AppDomain.CurrentDomain.SetData( "DataDirectory", context.TestDeploymentDir); } 

通常这会在您的解决scheme的TestResults\<test run>\Out\文件夹内创build您的数据库。

我在寻找问题的答案时发现了你的问题。 在单独的项目中使用EntityFramework与nUnit,我不得不改变App.config

看起来像这样:

 <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> </configuration>