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ファイルを手動で作成しても、エラーメッセージは変わりません。
試してください:
AppDomain.CurrentDomain.SetData(
"DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));
これにより、/ bin/Debug/yourdbname.mdfにDbファイルが作成されます
私は使うだろう:
// 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
を使用します
テストプロジェクトの場合:
AttachDBFilename = | DataDirectory |
これは、web/production/whateverアプリのApp_Dataフォルダーではなく、ユニットテストの出力/ bin/debugフォルダーを検索することを意味します。
2つのことを行う必要があります1.データベースファイルをApp_Dataフォルダーからテストアプリのルートに移動します。 2. Visual Studioでプロパティウィンドウが表示されるように、データベースを強調表示します。ビルドアクションを「コンテンツ」に設定すると、プロジェクトの実行時に出力アクションがコピーされます。
出来上がり。
このコードを使用することをお勧めします( Jupaol の答えに基づいて):
[ClassInitialize]
public static void SetUp(TestContext context)
{
AppDomain.CurrentDomain.SetData(
"DataDirectory",
context.TestDeploymentDir);
}
通常、これにより、ソリューションのTestResults\<test run>\Out\
フォルダー内にデータベースが作成されます。
問題の答えを探しているときにあなたの質問を見つけました。別のプロジェクトで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>