非常感謝@Justin和@Petro的回答,這對我的幫助非常大。我提出的解決方案是您所建議的技術的組合。下面介紹的解決方案爲每次測試運行提供一個新的數據庫,併爲每個測試提供一個單獨的事務。
我在測試項目的App.config中添加一個連接字符串我的測試數據庫:
<connectionStrings>
<add name ="TestDatabase"
providerName="System.Data.SqlClient"
connectionString="Data Source=(LocalDb)\v11.0;Database=TestDatabase;Integrated Security=True"/>
</connectionStrings>
我創建了一個基類,我的集成測試,爲客戶提供安裝和拆卸。安裝程序實例化上下文,創建數據庫(如果尚不存在)並啓動事務。拆解回滾交易。
public class EntityFrameworkIntegrationTest
{
protected MyDbContext DbContext;
protected TransactionScope TransactionScope;
[TestInitialize]
public void TestSetup()
{
DbContext = new MyDbContext(TestInit.TestDatabaseName);
DbContext.Database.CreateIfNotExists();
TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);
}
[TestCleanup]
public void TestCleanup()
{
TransactionScope.Dispose();
}
}
最後,我有一個類後,所有的測試都運行需要刪除數據庫的護理:
[TestClass]
public static class TestInit
{
// Maps to connection string in App.config
public const string TestDatabaseName = "TestDatabase";
[AssemblyCleanup]
public static void AssemblyCleanup()
{
Database.Delete(TestDatabaseName);
}
}
我要補充一點,我發現this blog post about Entity Framework什麼實體框架有更深的理解有用正在引導下/按慣例。
Jimmy Bogard撰寫的這篇文章是關於這個主題的一篇很好的文章:[在集成測試中隔離數據庫數據](http://lostechies.com/jimmybogard/2012/10/18/isolating-database-data-in-集成的測試/)。 –