2011-01-24 26 views
1

對我們的代碼做了一些更改,現在我需要重新考慮一些單元測試,以確保它們與新代碼兼容。我遇到了一個問題。在此:如何使用Rhino mock在測試對象中模擬一個值?

  ChannelLoad loader = new ChannelLoad(_customerDbMock, _bulkCopyMock); 
      loader.Execute(taskId); 

現在的「加載器」對象,嘗試連接到另一個對象,以得到一個字符串值,而被自動返回的字符串前。所以明顯的解決方案是嘲笑該對象爲測試返回合適的值。然而,由於各種原因,我不能輕易做到這一點。

理想情況下,我希望能夠做到的是獲得一個「真正的」(即如代碼中指定的)加載器對象,該對象執行「真正的」Execute方法,但具有特定的「模擬」值串。但我真的不知道如何做到這一點 - 即使可能 - 與Rhino Mocks。問題中的字符串屬性不是抽象的或任何 - 它是受保護的,它實際上是隻讀的。這是它的外觀裏面的「加載」:

protected string DbConnectionString 
    { 
     get 
     { 
      return _Service.GetLocalDatabase().GetConnectionString(_Service); 
     } 
    } 

而問題是,測試環境「GetLocalDatabase」什麼都不返回。

有人幫我在這裏?有沒有一種方法可以使用Rhino Mocks來模擬它,或者是我重構代碼以使其不依賴外部對象的唯一選項?如果後者,指針也會有所幫助。

乾杯, 馬特

回答

3

兩個選項,你不想注入_Service:

創建從ChannelLoad(稱之爲「TestableChannelLoader」什麼的)繼承的類和

  1. 覆蓋DbConnectionString-物業或

  2. 提取方法「GetConnectionString」,你可以在你的新類中重寫並調用它在DbConnectionString-物業

2

我看到裝載機具有依賴性_Service。所以,你需要將這個依賴的模擬注入到加載器中,以便更改DbConnectionString屬性的行爲。如果其他

+0

如果不進行重大重構,我無法做到這一點 - 是否真的是唯一的選擇? – 2011-01-24 12:23:04

相關問題