2013-06-26 44 views
1

私有構造函數的類我使用犀牛製品3.6如何嘲笑它具有使用犀牛製品

我有一個類「Configuration.cs」其中有一個私人的構造函數(我這樣做是爲了辛格爾頓實現)。 現在我想嘲笑這個類(部分模擬),但我無法做到這一點。 錯誤:

無法實例化類的代理:Efi.CrmIntegration.MonarchServices.Utilities.Configuration。 找不到無參數的構造函數。 參數名稱:,構造函數

請告訴我對於相同的解決方案。

回答

3

靜態單身難以嘲笑和測試,並應儘量避免,最好。正如RhinoMocks指出的,你不能對你的配置單例進行部分模擬,但你有一些選擇。

  1. 公開您的私人構造函數。不過,這應該被認爲是一種快速入侵。有很多更好的方法來做到這一點。

  2. 改變你的單身是如何實例化。給你的Configuration類接口,比如說IConfiguration。您可能已在Configuration上擁有一個靜態Instance屬性。將其類型更改爲IConfiguration,並將其設爲公開制定者。在你的單元測試中,模擬或存根IConfiguration,並設置Configuration.Instance屬性。這仍然是一種破解(但是當你有很多已經在使用單例的類時,這很有用,而且你沒有時間去實現下一個選項)。

  3. 使用依賴注入。給你的Configuration類別一個界面,我們再說一下IConfiguration。對依賴Configuration單例的類應該更改爲在其構造函數中使用IConfiguration參數。當您創建這些類之一的實例時,您將注入單例實例Configuration。測試時,製作IConfiguration類型的模擬或存根,然後將其傳遞給類。您可以使用依賴注入框架(如Castle Windsor或Ninject)進行改進,您可以使用它來廢除對靜態單例的需求。

我強烈建議你改變你的設計和使用選項3(與依賴注入框架,如果可能的話)。

+0

謝謝克里斯..我帶着你提到的第二個選項去了(你有很多已經在使用單例的類,而你沒有時間來實現下一個選項)就是我的場景。 – shals1031