私有構造函數的類我使用犀牛製品3.6如何嘲笑它具有使用犀牛製品
我有一個類「Configuration.cs」其中有一個私人的構造函數(我這樣做是爲了辛格爾頓實現)。 現在我想嘲笑這個類(部分模擬),但我無法做到這一點。 錯誤:
無法實例化類的代理:Efi.CrmIntegration.MonarchServices.Utilities.Configuration。 找不到無參數的構造函數。 參數名稱:,構造函數
請告訴我對於相同的解決方案。
私有構造函數的類我使用犀牛製品3.6如何嘲笑它具有使用犀牛製品
我有一個類「Configuration.cs」其中有一個私人的構造函數(我這樣做是爲了辛格爾頓實現)。 現在我想嘲笑這個類(部分模擬),但我無法做到這一點。 錯誤:
無法實例化類的代理:Efi.CrmIntegration.MonarchServices.Utilities.Configuration。 找不到無參數的構造函數。 參數名稱:,構造函數
請告訴我對於相同的解決方案。
靜態單身難以嘲笑和測試,並應儘量避免,最好。正如RhinoMocks指出的,你不能對你的配置單例進行部分模擬,但你有一些選擇。
公開您的私人構造函數。不過,這應該被認爲是一種快速入侵。有很多更好的方法來做到這一點。
改變你的單身是如何實例化。給你的Configuration
類接口,比如說IConfiguration
。您可能已在Configuration
上擁有一個靜態Instance
屬性。將其類型更改爲IConfiguration
,並將其設爲公開制定者。在你的單元測試中,模擬或存根IConfiguration
,並設置Configuration.Instance
屬性。這仍然是一種破解(但是當你有很多已經在使用單例的類時,這很有用,而且你沒有時間去實現下一個選項)。
使用依賴注入。給你的Configuration
類別一個界面,我們再說一下IConfiguration
。對依賴Configuration
單例的類應該更改爲在其構造函數中使用IConfiguration
參數。當您創建這些類之一的實例時,您將注入單例實例Configuration
。測試時,製作IConfiguration
類型的模擬或存根,然後將其傳遞給類。您可以使用依賴注入框架(如Castle Windsor或Ninject)進行改進,您可以使用它來廢除對靜態單例的需求。
我強烈建議你改變你的設計和使用選項3(與依賴注入框架,如果可能的話)。
謝謝克里斯..我帶着你提到的第二個選項去了(你有很多已經在使用單例的類,而你沒有時間來實現下一個選項)就是我的場景。 – shals1031