2010-06-11 118 views
22

Moles是由Microsoft創建的隔離框架。 Moles的一個很酷的功能是它可以「模擬」靜態/非虛擬方法和密封類(這對於像Moq這樣的框架是不可能的)。下面是一個什麼樣痣可以做到快速演示:如何實現Moles隔離框架?

Assert.AreNotEqual(new DateTime(2012, 1, 1), DateTime.Now); 

// MDateTime is part of Moles; the below will "override" DateTime.Now's behavior 
MDateTime.NowGet =() => new DateTime(2012, 1, 1); 
Assert.AreEqual(new DateTime(2012, 1, 1), DateTime.Now); 

好像痣能夠在運行時修改的東西CIL身體像DateTime.Now。由於Moles不是開源的,我很想知道Moles在運行時修改方法的CIL使用哪種機制。任何人都可以擺脫光線嗎?

+4

我強烈建議觀看@Peli的這3個視頻,解釋Pex和痣如何工作。他們很好! [Video Part 1](http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-13「Microsoft PEX/MOLES&advanced Unit-Testing aspects 1/3」) ; [Video Part 2](http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-23「Microsoft PEX/MOLES&advanced Unit-Testing aspects 2/3」) ; [視頻第3部分](http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-33「Microsoft PEX/MOLES 3/3」) – 2011-08-16 23:36:59

回答

49

之前痣實現了CLR分析器(特別是ICorProfilerCallback接口),允許重寫MSIL方法體它們由.NET運行時編譯成彙編代碼之前。這尤其是通過JitCompileStarted回調完成的。

在每種方法,痣引入了一個彎路,看起來像這樣:whenver執行方法,該方法被擡起頭來

static struct DateTime 
{ 
    static DateTime Now 
    { 
     get 
     { 
      Func<DateTime> d = __Detours.GetDelegate(
       null, // this point null in static methods 
       methodof(here) // current method token 
       ); 
      if(d != null) 
       return d(); 
      ... // original body 
     } 
    } 
} 

當您設置一個痣,你的委託存儲在基礎__Detours字典。

+4

+1用於實際展開如何工作。我也很好奇。很高興知道實際上有一種方法可以在調試模式下重寫方法;) – TomTom 2010-06-18 08:44:22

+0

我也是+1 - 我想知道他們是如何做到的,並且偶然發現 - 這也是合理的。 – 2011-06-22 06:45:22

+1

我強烈建議觀看@Peli的這3個視頻,解釋Pex和痣如何工作。他們很好! [Video Part 1](http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-13「Microsoft PEX/MOLES&advanced Unit-Testing aspects 1/3」) ; [Video Part 2](http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-23「Microsoft PEX/MOLES&advanced Unit-Testing aspects 2/3」) ; [Video Part 3](http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-33「Microsoft PEX/MOLES 3/3」) – 2011-08-16 23:37:35

0

這就像您想要的任何組件的包裝一樣工作,例如mscorlib(此示例基於mscorlib的Moles Assembly Wrapper)。這給你的權力取代由編碼器編寫的委託任何.NET方法。

這不工作automagicaly。您必須先在此開始之前創建工作,Moles XML配置文件與裝配列表「Wrapper」並由此代碼Moles從配置文件生成此裝配的參考。你必須在這個文件中添加using namespace System.Moles,並且功能[HostType("Moles")]