如何设置的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文件不会更改错误消息。
尝试:
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
什么类型是“context”和它从何而来? –
添加一个像这样的属性给你的测试类,MSTest会为你注入'public TestContext TestContext {get;组; }' – Jupaol
你能解释为什么在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\
文件夹内创建数据库。
嗨,使用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>
这对于使用DataSource属性的UnitTest有效? –
你可以检查你有什么样的价值在单元测试时,你调用:'AppDomain.CurrentDomain.GetData(“DataDirectory”)'? –
单元测试中'AppDomain.CurrentDomain.GetData(“DataDirectory”)'的值为'null'。 –
因此,要么通过使用'SetData'将值设置为某个路径,要么不要在连接字符串中使用'| DataDirectory |',因为它是'null'。 –