web-dev-qa-db-ja.com

Visual Studio 2012およびEntity Framework 5の単体テスト用にLocalDbをセットアップする方法

Entity Framework 5を使用したVisual Studio 2012 ASP.NET MVCプロジェクトがあります。

データベースに依存する単体テストがいくつかあります。中央のSQL Serverデータベースを使用するようにテストプロジェクトでapp.configファイルを設定すると、正常に機能します。

ただし、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ファイルを手動で作成しても、エラーメッセージは変わりません。

61
Klas Mellbourn

試してください:

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

これにより、/ bin/Debug/yourdbname.mdfにDbファイルが作成されます

34
zbw911

私は使うだろう:

// 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を使用します

10
Jupaol

テストプロジェクトの場合:

 AttachDBFilename = | DataDirectory | 

これは、web/production/whateverアプリのApp_Dataフォルダーではなく、ユニットテストの出力/ bin/debugフォルダーを検索することを意味します。

2つのことを行う必要があります1.データベースファイルをApp_Dataフォルダーからテストアプリのルートに移動します。 2. Visual Studioでプロパティウィンドウが表示されるように、データベースを強調表示します。ビルドアクションを「コンテンツ」に設定すると、プロジェクトの実行時に出力アクションがコピーされます。

出来上がり。

3

このコードを使用することをお勧めします( Jupaol の答えに基づいて):

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

通常、これにより、ソリューションのTestResults\<test run>\Out\フォルダー内にデータベースが作成されます。

1
Davide Icardi

問題の答えを探しているときにあなたの質問を見つけました。別のプロジェクトでnUnitでEntityFrameworkを使用して、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>