2011-08-05 199 views
0

我們已經在我們的代碼庫的幾個地方,我們做一些類似如下的內容:嘲諷System.Data.SqlClient.X類

DataTable dt = new DataTable(); 
using (DatabaseContext context = DatabaseContext.GetContext(false)) { 
    IDbCommand cmd = context.CreateCommand("SELECT * FROM X"); 
    SqlDataAdapter dataAdapter = new SqlDataAdapter((SqlCommand)cmd); 
    dataAdapter.Fill(dt); 
} 
return dt; 

我們如何使用模擬測試框架,像起訂量,除去我們測試依賴於數據庫?我想模擬返回的DataTable。

說明:我們有計劃改變這個代碼,但目前不能。它可能根本就是嘲弄嗎?

+0

如果您想使用像Moq或Rhino這樣的免費模擬框架,您將無法使用此代碼模擬數據表。但是,您可以考慮使用Typemock或JustMock來實現(但這些是昂貴的選項) – Raghu

回答

1

通過無法更改代碼我認爲你的意思是你不能做一個大的重構。這是我的建議。

  1. 提取代碼您提供給方法。
  2. 讓它虛擬
  3. 如果不讓它從包含此方法並將其命名爲OriginalClassNameTesting例如
  4. 覆蓋方法類保護或公共
  5. 繼承並返回任何數據表您wan't
  6. 在測試使用您的OriginalClassNameTesting類而不是原來的。

這種模式被稱爲'提取和覆蓋',它是很多書中提到的許多其中之一 - http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052

有些人可能不喜歡你正在爲測試添加虛擬方法。那麼,這只是第一步。你說你有重構計劃。那麼重要的是要進行測試,以確保你沒有制動任何東西。在Java中,每種方法都默認是虛擬的(或者我錯了嗎?)

2

我建議使用Repository模式,它隱藏存儲庫中的所有數據庫特定代碼。你可以模擬你的存儲庫,以便在上面的圖層中測試你的邏輯。

使用存儲庫來檢索數據和 其映射到從作用於 模型中的業務邏輯實體模型的邏輯分離。業務邏輯應該與包含數據源層的數據類型無關。例如,數據源層 可以是數據庫,SharePoint列表或Web服務。

存儲庫在數據源層和應用程序的業務層之間進行調解。它向數據源查詢數據, 將來自數據源的數據映射到業務實體,並將業務實體中的更改持續到數據源。存儲庫 將業務邏輯從與底層數據源或Web服務的交互中分離出來。

+0

是的,我們一定會盡快轉移到此。目前我們無法更改此代碼,但是,是否有任何方法來模擬它?我會在問題中澄清。 –