2013-03-15 103 views
1

我目前正在嚴重考慮我們的團隊正在構建的單元測試一個asp.net mvc 3 web應用程序。單元測試:真正的數據庫與嘲諷

問題是我們真的必須嘲笑很多東西,我認爲我們的單元測試並沒有涵蓋所有與網絡服務器和數據庫相關的東西。

例子:

我有下面的代碼的方法:

public List<Useraccount> GetUseraccounts(Company company) 
{ 
    return company.Useraccounts.ToList<Useraccount>(); 
} 

我devloper抱怨說,他有注射假的公司對象他通過hisself準備。 他想從數據庫中獲得真實的對象。

我的問題: 在單元測試期間是否可以使用真實數據庫(也可以是SQLite/SQLExpress或其他)?這有用嗎? 有什麼優點和缺點?我們不得不模擬太多的對象。例如,我們無法驗證此類呼叫是否正常工作:

Useraccount useraccount = UnitOfWork.UseraccountRepository.Get(u => u.EnableCode == enableCode && u.IsEnabled == false).Single<Useraccount>(); 
+2

聽起來好像你可能模糊了* unit * testing和* integration * testing之間的界限。 – 2013-03-15 12:46:08

+0

含義是什麼?真正的數據庫內容僅用於集成測試? – mosquito87 2013-03-15 12:49:14

+0

我相信@四十二意味着你應該考慮兩套測試。一個是關於單元測試,測試你的類做他們應該做什麼,嘲笑依賴。然後,您可以進入下一級黑盒/集成測試,您可以在其中全面測試您的服務,但可以在需要的地方剔除第三方服務。 – Bronumski 2013-03-15 13:27:50

回答

0

嘗試使用Effort工具。 Effort是一個功能強大的工具,它可以爲基於實體框架的應用程序創建自動化測試提供方便的方式。 它基本上是一個ADO.NET提供程序,它在輕量級進程內存數據庫而不是傳統外部數據庫上執行所有數據操作。它提供了一些直觀的幫助程序方法,可以很容易地將此​​提供程序與現有的ObjectContext或DbContext類一起使用。對現有代碼的簡單添加可能足以創建可在沒有外部數據庫的情況下運行的數據驅動測試。

1

對真實數據庫的測試是集成測試,而不是單元測試。您仍然可以像單元測試一樣運行集成測試 - 也就是說,可以通過nunit或mstest或其他任何方式運行它們,也可以通過命令行或類似的方式在您的構建服務器上運行它們 - 但還有一些額外的步驟:

  1. 您需要設置測試數據,將其注入數據庫,運行測試,然後再次刪除測試數據。在理想的情況下,您可以在集成測試運行開始時創建測試數據庫,然後運行所有測試,然後在所有集成測試完成後將其刪除。這可能是不切實際的。

  2. 您的集成測試運行速度比單元測試慢得多。通過運行它們來爲此做好準備,例如,每晚在構建服務器作業中運行它們。

在使用SqlLite或任何方面,我說不要,用你使用在現實世界數據庫的確切類型,否則就不是一個值得信賴的測試。

+0

感謝您的回答。 基本上我們首先想要「完成」單元測試。我的感覺是它們不完整,因爲我們無法在代碼中測試很多行,因爲實體框架。 – mosquito87 2013-03-15 13:28:20

+0

我想說這是一個罕見的應用程序,它可以僅使用單元測試覆蓋所有(甚至大部分)數據訪問代碼行。話雖如此,你確定EF是否是問題,並且該代碼不能被重新編譯爲單元測試? – 2013-03-15 14:12:17