2014-09-26 46 views
1

當我們有一個類,如我們應該創建包含附加模擬的基礎測試類嗎?

class IntoController(IViewModelCreator viewModelCreator) {} 

class ProductController(ICommandFactory commandFactory, IViewModelCreator viewModelCreator) {} 

class ProductController(ICommandFactory commandFactory, IViewModelCreator viewModelCreator, IRepository repository) {} 

和多很多。每次模擬這個接口需要很長時間。對於包含一大組模擬的通用課程,你怎麼看?

class BaseControllerUnitTests 
{ 
    protected Mock<IViewModelCreator> ViewModelCreator { get;set; } 
    protected Mock<ICommandFactory> ViewModelCreator { get;set; } 
    protected Mock<IRepository> ViewModelCreator { get;set; } 
} 

在此先感謝。

回答

4

我其實這樣做;我只是把它們放在一個叫TestDataFactory的不同類中,所以我不會遇到繼承的問題(以防萬一我需要在測試中擴展一些其他基類)。

工廠不應該是全局/靜態的(見下文)。

臨:

  • 有一個地方所有的測試去獲得一個有效的對象圖
  • 如果對象圖的變化,只有一個地方可去解決所有的測試
  • 您可以在工廠中保留模擬內部方法調用的引用(例如,您可以要求ProductController及更高版本,當您要求輸入ICommandFactory時,會得到注入控制器的模塊)。

缺點:

  • 測試工廠將成爲相當大。最終,你將不得不把它分成幾個文件。
  • 並非所有的測試都需要完全相同的樣機。有時候,你需要插入一個真實的物體。我的解決方案是允許覆蓋工廠保存的引用。但它使代碼更加笨拙。
0

您正在編寫測試代碼的事實並不意味着所有的軟件工程最佳實踐都應該走出去。 如果你的測試之間有一個共同功能的子集(在這種情況下 - 嘲笑測試類的一些方法),那麼是的,無論如何 - 你可以提取一個基類。

1

除了Aaron Digulla的回答,我想建議我的colleague's post舉一些例子。他稱之爲測試環境。我也使用這種方法。

相關問題