![](/img/trans.png)
[英]Should I make copies of my unit tests that use mocks and change them to a real database for integration testing?
[英]How should I set up my integration tests to use a test database with Entity Framework?
我正在為應用程序編寫集成測試,並且無法找到有關如何為我的集成套件設置測試數據庫的最佳實踐。 我正在使用實體框架代碼優先處理ASP.NET MVC4應用程序。
我可以確認我的測試項目中的測試默認與我的機器上的本地開發數據庫通信。 這並不理想,因為我希望每次運行測試時都有一個新的數據庫。
如何設置我的測試項目以便我的測試與單獨的實例進行通信? 我假設可以設置SQL Server Compact Edition實例,但我不知道如何配置它。
非常感謝@Justin和@Petro的回答,這對我幫助很大。 我提出的解決方案是您建議的技術的組合。 下面描述的解決方案為每次測試運行提供了一個新數據庫,並為每個測試提供了一個單獨的事務。
我在我的Test項目的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);
}
}
我應該補充一點,我發現這篇關於實體框架的博客文章有助於更深入地了解實體框架正在做什么/按照慣例。
只需在單元測試項目的app.config中設置一個指向新數據庫實例的連接字符串。
然后,您可以使用測試類中的初始化和清理方法來創建和刪除數據庫。
連接字符串就是常見的,例如
<add name="UnitTestDBConnection" connectionString="Data Source=(local);Initial Catalog=UnitTestDB;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
然后創建數據庫,每次測試一次,你可以做:
YourContext _ctx;
[TestInitialize]
public void Initiaslise()
{
YourNameDbInitialise initialiser = new YourNameDbInitialiseForTest();
Database.SetInitializer(initialiser);
_ctx = new YourNameContext();
initialiser.InitializeDatabase(_ctx);
}
這將在每次測試結束時刪除
[TestCleanup]
public void Cleanup()
{
Database.Delete("YourName");
}
如果您使用的是NUnit,則可以使用TransactionScope
Setup/Teardown
屬性不將更改提交到數據庫:
[SetUp]
public void SetUp()
{
transaction = new TransactionScope();
}
[TearDown]
public void TearDown()
{
if(transaction != null)
transaction.Dispose();
}
如果您正在使用其他一些單元測試框架,它應具有類似的屬性。 我建議為所有集成測試裝置創建一個基類DbItegrationTest
,所以如果從這個類派生,所有測試方法都不會對數據庫進行提交。
要為其他數據庫配置Entity Framework,請覆蓋測試程序集中的db連接字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.