如何在Visual Studio 2012和Entity Framework 5中为单元测试设置LocalDb

Kla*_*urn 61 unit-testing mstest entity-framework-5 localdb visual-studio-2012

我们有一个使用Entity Framework 5的Visual Studio 2012 ASP.NET MVC项目.

有些单元测试依赖于数据库.在测试项目中设置app.config文件以使用中央SQL Server数据库可以正常工作.

但是,使用LocalDb会更好,因此每个开发人员在运行测试时都有自己的数据库.特别是因为我们希望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" />
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

听起来它想要mdf文件已经存在,这似乎很奇怪,因为它试图创建数据库.手动创建mdf文件不会更改错误消息.

小智 34

尝试:

AppDomain.CurrentDomain.SetData(
  "DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));
Run Code Online (Sandbox Code Playgroud)

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


Jup*_*aol 10

我会用:

// 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));
}
Run Code Online (Sandbox Code Playgroud)

您可能会遇到问题AppDomain.CurrentDomain.BaseDirectory,而是使用:context.TestDeploymentDir

  • 将这样的属性添加到您的测试类中,MSTest将为您注入`public TestContext TestContext {get; 组; }` (3认同)