2009-08-10 17 views
2

我們正在建立一個ASP.NET MVC的網站,我與這裏定義的連接最好使單元測試掙扎(我使用「連接」一般 - 它可能是一個會話,連接,適配器,或任何其他類型的數據上下文可以管理事務和數據庫操作)。在MVC中實例化Data Context(適配器,連接,會話等)的位置?

比方說,我們有3類:

UserController 
UserService 
UserRepository 

在過去,我們會做UserService的方法中是這樣的:

Using (ISomeSession session = new SomeSession()) 
{ 
    session.StartTransaction(); 
    IUserRepository rep = new UserRepository(session); 
    rep.DoSomething(); 
    rep.Save(); 
    session.Commit(); 
} 

然而,這是不是真的因爲SomeSession的依賴沒有被注入,所以可以對它進行單元測試。但是,如果我們使用D.I.要在UserService中注入依賴關係,會話在UserService的整個生命週期中都會掛起。如果從UserController調用了多個服務,則每個會話都可以掛起,直到UserController被垃圾收集爲止。

有關如何更好地管理此問題的任何想法?我錯過了明顯的東西嗎?

編輯

對不起,如果我不清楚 - 我知道我可以使用依賴注入與Session /數據上下文,但後來它被保存在服務類的生活。對於任何運行時間較長的操作/方法(即假設服務正在被批處理進程調用),除了增加可測試性之外,這可能會導致大量的開放會話。

+1

如果您使用真正的連接進行測試,那麼您不是單元測試,而是集成測試。 – RichardOD 2009-08-10 10:04:34

+0

理查德 - 我明白這一點。我的觀點是,我不知道如何在整個課程生命週期中保持連接不活動(或至少上下文活動),而不是在Using語句中的一小段時間內將依賴關係移動到課程級別。 「使用」塊似乎更安全,因爲它在需要時打開連接,並在完成時關閉連接。 – 2009-08-10 18:37:53

回答

2

由於RichardOD正確指出,你不能使用編寫單元測試活動數據庫連接。如果你正在做,那麼你就是集成測試。

我有我的倉庫接口,一個真正的資源庫,並進行單元測試一個假倉庫單獨實現。假存儲庫在通用列表上工作,而不是真正的數據上下文。我正在使用DI(與Ninject一起使事情變得更加舒適,但您也可以手動完成)來注入正確的存儲庫。

只有在我與現實的連接單元測試極少數情況下,但是這是我的倉庫類單元測試,不爲任何控制器,UI或業務層對象。

編輯:隨着你添加的評論,我想我現在明白你實際要求的是什麼。有趣的是,你會問這個問題,因爲我上週工作在同一個主題上:-)

我在非常薄的包裝器中實例化數據上下文,並將上下文放在HttpContext.Current.Items字典中。這樣,上下文就是全局的,但只適用於當前的請求。

不過,你的問題的主題是很大的誤導性。你問「在哪裏實例化數據上下文進行單元測試」,答案是你通常不會。我的單元測試仍然使用假存儲庫。

+0

沒關係,如果你downvote,但它會很好解釋爲什麼這種情況... – 2009-08-10 14:31:41

+0

對不起......我應該回應。你的回答是正確的,但我低估了它,因爲它沒有回答我的問題。我明白D.I.以及如何創建一個虛假的存儲庫。問題在於上下文是在倉庫之外定義的,並且也可以傳遞給其他服務/倉庫類(即他們可以參與交易)。如果我們在Service的c-tor中實例化上下文/連接(或者注入它),上下文的生活將與Service的...一樣,實質上,我們將連接狀態擴展到遠遠超出典型的「使用(新上下文) {...}「。 – 2009-08-10 18:08:01

+0

啊,好的。看到我上面的編輯... – 2009-08-10 20:23:03

-2

最簡單的方法是讓你在web.config中定義的開發和生產的ConnectionString。對於Unittests,你可以在你的Testproject的app.config中定義它。

相關問題