我喜歡關於Rails'和Django's測試方法的一件事是他們支持在每次測試運行之前使用燈具來建立數據庫。使用燈具測試實體框架
在過去,我已經使用嚴格的單元測試與模擬存儲庫結合使用來測試我的代碼,但是我很想擁有與上述測試方法一樣易於使用的東西,以便執行集成測試。
我聽說過這種類型的代碼優先和EF 5的支持,但我不知道它是否升到了Rails和Django提供的水平。
當然有東西可比。 任何信息將不勝感激!
我喜歡關於Rails'和Django's測試方法的一件事是他們支持在每次測試運行之前使用燈具來建立數據庫。使用燈具測試實體框架
在過去,我已經使用嚴格的單元測試與模擬存儲庫結合使用來測試我的代碼,但是我很想擁有與上述測試方法一樣易於使用的東西,以便執行集成測試。
我聽說過這種類型的代碼優先和EF 5的支持,但我不知道它是否升到了Rails和Django提供的水平。
當然有東西可比。 任何信息將不勝感激!
在EF5新概念已經推出,被稱爲遷移。您可能曾經在Rails或Django應用程序中使用過類似的東西。
遷移是一個類,它有幾個功能來升級/降級數據庫的版本。
public partial class VoteTime : DbMigration
{
public override void Up()
{
AddColumn("Votes", "Time", c => c.DateTime(nullable:false, defaultValue:DateTime.UtcNow));
}
public override void Down()
{
DropColumn("Votes", "Time");
}
}
您還必須設置DbContext和DbMigrationsConfiguration配置類,以允許代碼優先的方法工作。
對於您需要引入測試目的,TestDatabaseInitilizer
public class TestDatabaseInitilizer : DropCreateDatabaseAlways<DbContext>
{
}
這將是負責爲單元測試測試數據庫的初始化。
最後,你應該設計你的測試代碼來設置上下文。
public class SomeRepositoryTests
{
private DbContext _context;
[SetUp]
public void Setup()
{
Database.SetInitializer(new TestDatabaseInitilizer());
_context = new DbContext("TestContext");
_repository = new SomeRepository(_context);
}
[Test]
public void should_return_some_entities()
{
Assert.That(_repository.Get(), Is.Not.Null);
}
}
如果需要,可以將設置代碼移動到基類。
對於包含多個表和遷移歷史記錄較長的數據庫,刪除數據庫併爲每個測試類(甚至方法)重新創建它可能會給測試時間帶來很大的開銷。 –
我用Entity Framework開發了一個應用程序,它有600多個自動化集成測試。這是我使用的過程:
實體框架代碼第一次遷移只是爲了設置數據庫結構(表,索引等)。我不使用遷移來種子數據。
用於將數據庫設置爲特定的已知狀態的SQL腳本。例如,一個插入ASP.NET成員資格用戶的腳本;另一個爲最相關的表格設置樣本數據;和其他更具體的場景。這些腳本通常會從適當的表中刪除記錄並再次插入,以避免關係衝突。這些腳本作爲嵌入式資源包含在Visual Studio項目中。
可以通過名稱從資源中獲取腳本並在數據庫中執行腳本的助手類,包括使用「GO」命令批處理命令。 ConnectionContext.ExecuteNonQuery可用於此。
在整個測試套件開始時,我執行設置用戶,權限和其他非常常見的環境配置的腳本。
每個測試方法之前,我執行一個或多個腳本,酌情設定在由測試正在運行所需的上下文數據庫。例如,在讀取,插入,更新和刪除數據的一系列CRUD測試之前,我運行一個腳本,爲測試數據分配適當的表。
我寫測試用例假設數據庫在一個特定的上下文中設置。例如,更新操作的測試將嘗試使用已知密鑰檢索記錄,更新它並再次讀取以檢查它是否在數據庫中更新。
雖然SQL腳本是不容易寫,讀爲Rails的賽程,他們是非常快的,可以做任何需要的操作(如DELETE,INSERT,UPDATE,執行存儲過程)。
該技術在涉及50個數據庫表和非常複雜的業務規則和流程的一個項目是很好的證明。它保持測試簡單和一致。
感謝您的經驗 – nXqd
我剛剛知道@LadislavMnrka將全部結束這一個。 :) –
我相信[AutoFixture](https://github.com/AutoFixture/AutoFixture)與您正在尋找的解決方案相距甚遠,但這是我能找到的用於EF自動化燈具的最接近的東西。 –
不完全是,EF允許重新初始化數據庫(再次創建它,可能添加數據等),但是這不附加到任何測試框架,當您在Visual Studio中重新啓動應用程序時,每個事情都會完成。但是,如果需要,也可以從您的測試框架調用此初始化方法 –