2014-04-22 155 views
2

場景:我有一個類在其默認構造函數中訂閱靜態事件。因此,該課程製作爲IDisposable,以便它可以取消訂閱靜態事件並且適當地進行垃圾收集。這門課在使用RhinoMocks進行測試時被模擬。它有複合部分的孩子,可能或可能不是IDisposable嘲笑IDisposable類

問題:由於Dispose方法被RhinoMocks自動模擬,我正在泄漏這些對象。這會導致不同測試中的「隨機」錯誤,因爲仍然訂閱的對象會對未正確設置的事件作出反應。

問題:我知道RhinoMocks有方法說明應該調用原始方法(CallOriginalMethod),但我注意到RhinoMocks有時會在我自己的聲明之外創建代理。因此,我認爲我不能阻止這些對象被泄露。有沒有辦法解決這個問題?

+0

這不是'IDisposable'的用途。你總是需要手動調用Dispose,所以你不能依賴它被調用。靜態事件是一種可怕的模式,你應該避免它們像瘟疫一樣。我知道這並不能真正回答你的問題,但是你應該修改你的應用程序設計 - 如果你依賴於靜態事件,你很可能會做一些非常錯誤的事情。至少,您應該使用您自己的活動管理器,例如只使用弱引用(如果這是您的使用模式) - 如果您發現該對象已在此期間收集,請將其從經理中移除。 – Luaan

+0

我全心全意地認同你@Luaan,訂閱靜態事件會導致各種問題,應該避免。令人遺憾的是,在我加入之前的幾年中,這已經在客戶的框架中實現了,並且已經成爲管理應用程序事件的重要組成部分。重構不是一種恐懼的選擇,因爲沒有人會爲此付費。我已經研究過弱事件訂閱,但還沒有發現任何感覺可靠或完整的東西。你知道一個很好的來源,我都耳朵:) – Xilconic

回答

0

當嘲笑可以在附加的接口(或類型)通過一個類來實現(例如IDisposable接口)

在撕裂單元測試的向下階段可以嘲笑對象投射到一個類型IDisposable接口的和調用Dispose

+0

對不起,但我不遵循?你能詳細說明一下嗎?也許有一個(僞代碼)的例子? – Xilconic