2010-04-07 91 views
4

我正在嘗試對某些現有代碼庫進行單元測試。我想要進行單元測試的類和方法都使用從ContextBoundObject和ContextAttribute繼承的自定義屬性進行裝飾。我不希望他們作爲單元測試的一部分運行。從ContextBoundObject繼承並用ContextAttribute裝飾的單元測試類

我想出的唯一解決方案是在我想單元測試時編譯出屬性。我不太喜歡這個解決方案,並希望在運行時將其替換爲mocked屬性,或者防止該屬性以更優雅的方式運行。

如何測試具有從ContextBoundObject和ContextAttribute繼承的類和方法屬性的代碼,而不想將其作爲單元測試的一部分運行?

在此先感謝。

+0

您的類是否繼承自ContextBoundObject或ServicedComponent?否則,屬性不會執行,而只是在編譯期間實例化和序列化,並隨後存儲在輸出程序集中。 – 2010-04-08 00:06:19

+0

感謝您的評論。我試圖測試的類是從ContextBoundObject繼承的。 – 2010-04-08 00:12:15

回答

2

從ContextBoundObject繼承的類通過傳遞消息而不是傳統的基於堆棧的執行模型來執行方法。這種能力被用作遠程處理和COM互操作的基礎。其中一個有趣的選擇是,使用屬性攔截方法調用變得可能,這允許一種「窮人AOP」。

擺脫屬性提供的邏輯的選項之一是創建一個配置文件來覆蓋當你新建你的類時創建哪個類。此功能僅適用於從MarshalByRef繼承的類,該MarshalByRef是ContextBoundObject的基類。

另一種選擇可能是使用反射來創建類的實例。也就是說,要找到一個特定的ConstructorInfo並調用它來創建一個實例。當你只是一個新的實例時,這個調用被路由到Activator.CreateInstance,這可能會給你一個實際類的代理對象。直接創建對象可能會繞過這一點,雖然它是在黑暗中拍攝的。

+0

我希望能有更好的方法。這些都是非常好的建議,謝謝。 – 2010-04-14 03:38:52