2010-11-23 53 views
3

事情從我的假存儲庫開始很簡單,其中包含硬編碼的實體列表。ASP.NET MVC單元測試 - 假庫已變得笨拙

隨着我的進步,我的共享虛假資料庫變得臃腫。我不斷地向這些列表添加新的屬性和新的實體。這使得維護非常困難,而且很難看到測試正在做什麼。我相信這是一種稱爲「General Fixture」的反模式。

在研究ASP.NET MVC單元測試中,我看到了兩種方法來準備傳遞給控制器​​的存儲庫設備。

  1. 創建將在所有的測試中共享
  2. 存儲庫的模擬部分,每個部分的測試

我很想去探索選項#2以上之內,但我讀過硬編碼的假庫模擬倉庫並不是一個好主意,在我測試控制器對集合進行操作的場景中(例如,使用分頁/排序/過濾功能),這似乎相當艱鉅。

我對社會問題...

準備倉庫燈具方法的工作遠遠超出了基本的例子是什麼?

回答

2

我不認爲你應該只選擇兩個選項之一。有些情況下使用虛假的存儲庫會更好,並且有時候模擬會更好。我認爲你應該根據具體情況評估你所需要的。例如,如果你正在編寫一個UsersService的測試,需要調用返回布爾值的IUserRepository.DoesUserExist(),那麼你不會使用虛假的存儲庫,它更容易模擬一個調用返回true或false。

Moq太棒了。

+0

這些都是很好的答案。自從我發佈此問題以模擬單個測試的存儲庫並且運行良好以來,我一直在使用Moq。我相信按照您的建議使用兩種方法都是有效的。我也發現創建例程生成用於模擬的數據非常有用 - 這樣我就不會複製代碼來創建數據,但數據也不會共享。 :) – Mayo 2010-11-30 15:53:29

2

對於一個新項目的類似原因,我正在研究使用ORM(NHibernate在我的情況)。這樣我就可以將它指向「內存中」的SQLLite實例(而不是SQL Server),並且它應該更容易設置/維護(我希望)。這樣,如果我有要求測試特定場景(如超時等)的需求,那麼我只需要模擬知識庫。

2

如果您正在使用TDD的單元測試,請下載Rhino Mocks並使用選項#2。

+0

還有MOQ(http://code.google.com/p/moq/),我一直在使用#2。我也發現這是相當笨拙和耗時的,這就是爲什麼我要以ORM角度來看待。 – 2010-11-23 15:35:58

1

大多數情況下,我們會使用特定於測試的存儲庫嘲諷。我從來沒有見過建議不要自己這樣做,我發現它的效果很好。大多數情況下,我們的存儲庫方法以及因此我們的模擬只返回單個模型或模型列表(而不是數據上下文),因此很容易爲每個測試創建特定的數據並將其隔離到每個查詢。這意味着我們可以嘲笑我們喜歡的任何數據,而不會影響同一測試中的其他測試或查詢。很容易看出爲什麼創建數據以及測試的是什麼。

我一直在團隊也決定不時創建共享模擬數據。我認爲這個決定通常是由於例程生成動態查詢,並且模擬所有測試所需的數據導致數據庫的很大一部分被複制。但是,回想起來,我可能會建議只檢查結果查詢,而不是從數據庫返回的內容。因此,根本沒有數據會被嘲笑,它需要一些代碼更改。我只提到這一點,以說明如果你看不到找到一種方法來使選項2工作,也許有一種方法來重構代碼,使其更具可測性。