2011-10-20 35 views
1

所以我只是習慣了嘲笑的東西。我這裏有這個私有變量:使用Rhino Mock來模擬私人對象電話

private CoreDataContext _coreDataManager; 

在這個類:

public class RatesControlReport 
     : Chatham.Panda.Batch.ProcessDefinition.BatchProcess 

該類上有一個void的方法,我想測試名爲CheckSwaptionVols(DateTime runDate)

在我的測試的第一部分,我可以實例化主類:

RatesControlReport ratesControlReportProcess; 
      ratesControlReportProcess = new RatesControlReport(); 

,基本上我想使這個電話:

ratesControlReportProcess.CheckSwaptionVols(DateTime.Now); 

但是此方法使用私有變量,像這樣:

System.Data.Linq.ISingleResult<CheckSwaptionVols> swaptionStatusResult = _coreDataManager.CheckSwaptionVols(this._runDate); 

我希望能夠通過這個變量的模擬版本,而不是打開我自己指定的System.Data.Linq.ISingleResult<CheckSwaptionVols>,這樣測試可以繼續而不依賴於數據庫。

我該怎麼做?

回答

5

那麼,這取決於你在哪裏實例化CoreDataContext。如果這是在靜態上下文中構造的,或者在構造函數中構造,那麼真的沒有辦法爲它創建一個模擬。這就是爲什麼在對象內實例化依賴關係通常被認爲是不好的做法。你需要做的是提供一些依賴注入的方法。這可以作爲一個重載的構造簡單:

public RatesControlReport(CoreDataContext context) 
{ 
    _coreDataManager = context; 
} 

...或者即使你絕望的內部方法:

internal void InjectContext(CoreDataContext context) 
{ 
    _coreDataManager = context; 
} 

一般來說,然而,它被認爲是最佳實踐總是在構建您的RatesControlReport時提供您的CodeDataContext對象。這將從業務邏輯中分離數據訪問,這將允許您更有效地對這兩個類進行單元測試。

+0

+1同意。不傳遞對象到構造函數中導致非常「痛苦的屁股」設置單元測試。或者更糟糕的是,放棄單元測試,因爲他們太麻煩了。 –