2009-07-02 102 views
11

我試圖測試一些類,我使用嘲笑,但我已經看到在C#中的所有免費嘲笑框架不能嘲笑非虛擬方法(如果它是不在界面中)。在C#中嘲弄非虛擬方法#

但是,有TypeMock誰可以做到這一點,所以它是可能的。任何人都可以展示如何做到這一點?如果我能做到這一點,我甚至可以嘗試爲開源框架做出貢獻。

在此先感謝

+0

最好的猜測,AppDomains,Reflection.Emit和hackery和魔術的組合。但我很難有資格對此進行許多有教育的猜測。 – 2009-07-02 10:50:55

+0

添加了typemock標記 – BengtBe 2009-07-02 11:21:22

+0

另請參閱http://stackoverflow.com/questions/2187513/how-to-make-a-unit-test-mock-of-an-object-with-non-virtual-functions/6690183 – 2011-07-14 08:06:10

回答

7

根據它使用AOP來重定向呼叫website

Typemock隔離器採用面向方面的技術重定向從實際的代碼調用。這使開發人員能夠定義測試場景所需的外部組件的行爲。例如,通過指示Typemock Isolator在寫入數據庫時​​拋出OutOfDiskSpaceException,可以模擬寫入數據庫時​​磁盤已滿。這是一種在沒有Typemock Isolator的情況下幾乎不可能測試的情況。開發人員在實際單元測試中定義行爲,並且Typemock Isolator自動隔離所有必需的組件。

該技術要求您在運行測試或使用VS插件之前設置特殊環境。

有些人認爲模擬一切的能力使Typemock 功能太強大,因爲你不必多想好設計。從Ayende引述:

類型模擬的主要弱點是它的力量,它讓我採取我不想走捷徑,我希望得到一個系統,低耦合,高凝聚力。

不過,當然,因爲他是犀牛模擬的創世他是不客觀的:)

我會認爲你是在爲工作很大,如果你想創建具有此功能的模擬框架,所以我會建議要麼購買Typemock,要麼學會編碼沒有它:)

14

我來自Typemock,我不會解決「太強大」的評論(儘管它超出了我爲什麼人們不想要爲這項工作使用最好的工具)。

以下是Typemock Isolator的工作原理。你有沒有使用性能分析器?隔離器是一個分析器。它與CLR掛鉤,並在測試運行時間內改變方法。當一個方法得到JIT的時候,它會改變它,所以當方法運行時,在執行原始代碼之前,它會問:我應該按照最初的意圖運行它,如果沒有,我應該怎麼做?由於這種特定的技術,它可以嘲笑任何.Net方法和技術。而已。

當您使用API​​設置行爲時,問題的答案現在變成了intersting,並更改了該方法在運行時的行爲。簡單,但涵蓋了它很多工作:)

隔離器附帶一個VS AddIn使無縫地在VS中運行測試,並使用命令行工具和MSBuild或NAnt任務在構建服務器中使用。

我很樂意回答您可能遇到的任何其他問題。