2012-02-03 27 views
0

我希望能夠編寫測試代碼。但我的行動是耦合到我的DataContext。我怎樣才能消除依賴?如何解耦控制器中的依賴關係?

public ViewResult About() 
    { 
     var db = new CamaDataContext(); 

     var item = new PropertyViewModel(); 


     AutoMapper.Mapper.Map(db.dataProperty.FirstOrDefault(),item); 

     return View(item); 
    } 

回答

1

使用依賴注入框架(例如ninject或structuremap)通過控制器的構造函數傳遞它,然後在編寫測試時,可以在思想構造函數中傳遞這些依賴項。

這也將提供您有機會嘲笑那些depenedencies出來,實際上並沒有對您的數據庫調用同時測試

2
  1. 爲不同的實體創建存儲庫接口。

  2. 爲不同的實體創建具體存儲庫。

  3. 將這些存儲庫存儲在控制器級別。

  4. 使用Controller的構造函數允許注入庫(如果沒有提供,則使用具體實現)。

這將允許您在單元測試期間模擬庫,以使兩者不緊密耦合。

+0

的倉庫也應與工作單位相關的,否則他將不得不與存儲庫(除非他不希望事務支持)混合數據庫代碼。 – 2012-02-03 19:26:35

+0

@ChristopherHarris - 我把那一部分拿出來了。這完全取決於系統的構建方式。如果他們正在使用依賴注入,那麼您可以將管理上下文的責任推到那裏,使得存儲庫不必擔心上下文。 – 2012-02-03 19:31:14

+0

有人可以通過將我的回購與工作單元關聯來詳細說明您的意思嗎? – 2012-02-03 21:23:39

1

您可以輕鬆地重構上面的代碼來測試它(假設你有一些業務邏輯測試)。任何邏輯移出到您在X實體中傳遞給的類。然後,您只需通過填充類並將其發送出去即可測試您的邏輯。

作爲替代方案,請保持您的控制器操作非常輕量級,以免它需要測試。

同樣在一個單獨的說明,處置您的上下文類:使用

(VAR DB =新CamaDataContext()){ .. 返回查看(..) }

另外考慮如此處所示的[AutoMap()]屬性,以使您的操作方法更加精簡。

http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

我將在控制器這樣將不需要測試內容的兩個線路的方法。