2010-08-27 192 views
12

在Microsoft .Net Framework的背景下,我真的很好奇嘲諷框架(Rhino Mocks,Moq,NMock,)實際上是創建來自給定類型的模擬對象。模擬框架(在.Net中)如何創建模擬對象?

我對一種方法的具體機制感興趣,或者如果他們使用不同的方法或許可以對不同方式進行一些概述。或者,如果有人能夠指出我的一些文章,那也會很棒。

+0

這是一個很好的問題。你可以把程序集放到Reflector中,看看代碼開始。 – fletcher 2010-08-27 18:58:14

+3

你可能想看看Castle DynamicProxy - http://www.castleproject.org/dynamicproxy/index.html。很多.NET模擬框架都是在這個底層使用的。 – 2010-08-27 18:59:25

+0

正如前面提到的,[redgate Reflector](http://www.red-gate.com/products/reflector/)是一個很好的程序,用來計算編譯程序集內部發生了什麼。它的確像將DLL拖放到Reflector並檢查代碼一樣簡單。 – 2010-08-27 19:00:00

回答

16

有嘲笑有不同的技術。

一些嘲諷的書庫如MoqRhinoMocks使用Castle Dynamic proxies。實際上,他們使用反射和運行時代碼生成(CodeDom)來動態生成類,這些類可以實現被模擬的接口,也可以從被模擬的非密封類中派生。

TypeMock有點不同 - 它使用Profiler API攔截和重定向調用任何類型的任何方法。這使得它能夠模擬密封類型,系統類,甚至攔截並轉移對具體類型的非虛擬方法的調用。

UPDATE:從TypeMock website

Typemock隔離器使用一個方面 - 面向對象的編程設計, 創建一個模擬方面。在內部,它使用.NET Framework分析器API 來監視應用程序的執行。 當調用方法時,CLR 會通知Typemock Isolator。 框架然後可以返回模擬的 值並完全覆蓋原始代碼 。

+0

JustMock是否也使用Debugger API? (順便說一句,我認爲它是探查器API?) – 2010-08-27 19:08:46

+0

鏈接到剖析API - http://msdn.microsoft.com/en-us/magazine/cc301725.aspx – 2010-08-27 19:09:52

+0

@Russ凸輪:我讀了一個點,我似乎記得它使用調試API來攔截對象的創建和完成。它也可以使用分析器API,因爲它們非常適合它所做的事情。但是,我不是100%確定的,目前我找不到相關的文檔。 – LBushkin 2010-08-27 19:12:29