如何设置的LocalDB单元测试在Visual Studio 2012和Entity Framework 5

问题描述:

我们使用实体框架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" /> 

我得到:

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

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

+1

你可以检查你有什么样的价值在单元测试时,你调用:'AppDomain.CurrentDomain.GetData(“DataDirectory”)'? –

+0

单元测试中'AppDomain.CurrentDomain.GetData(“DataDirectory”)'的值为'null'。 –

+1

因此,要么通过使用'SetData'将值设置为某个路径,要么不要在连接字符串中使用'| DataDirectory |',因为它是'null'。 –

尝试:

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

这将在/bin/Debug/yourdbname.mdf

创建数据库文件

我会用:

// 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

+1

什么类型是“context”和它从何而来? –

+3

添加一个像这样的属性给你的测试类,MSTest会为你注入'public TestContext TestContext {get;组; }' – Jupaol

+0

你能解释为什么在setup方法中这样做比在我的'new Migrations.Configuration();'之前更好吗? – bbodenmiller

请记住,对于测试公关oject:

 
AttachDBFilename=|DataDirectory| 

意味着它会看着你的输出/斌/ debug文件夹中的一个单元测试在你的web /生产/任何应用反对App_Data文件夹。

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

Voila。

我建议使用此代码(基于Jupaol答案):

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

通常这将解决方案的TestResults\<test run>\Out\文件夹内创建数据库。

+0

嗨,使用VS 2013这个代码工作时,我在“调试测试”模式下运行我的单元测试。但是当我运行“全部运行”测试时失败。我怎样才能让它在“全部运行”模式下工作 – Martin

我在搜索问题的答案时发现了你的问题。 在一个单独的项目中使用的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>

+0

这对于使用DataSource属性的UnitTest有效? –