62

我们有一个使用 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”可能不正确。诊断并更正其他错误,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。检查相关错误。

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

4

5 回答 5

34

尝试:

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

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

于 2013-02-04T05:31:43.097 回答
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));
}

使用 可能会出现问题AppDomain.CurrentDomain.BaseDirectory,而不是使用:context.TestDeploymentDir

于 2013-03-08T15:52:00.290 回答
3

请记住,对于测试项目:

AttachDBFilename=|数据目录|

意味着它将在您的输出 /bin/debug 文件夹中查找单元测试,而不是您的 web/production/whatever 应用程序中的 App_Data 文件夹。

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

瞧。

于 2013-11-19T21:20:32.307 回答
1

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

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

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

于 2013-11-24T15:38:26.000 回答
0

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

于 2014-10-21T21:49:03.953 回答