如何实施Moles隔离框架?
Moles是Microsoft创建的隔离框架。 Moles的一个很酷的function是它可以“模拟”静态/非虚拟方法和密封类(这对于像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);
看起来像Moles能够在运行时修改DateTime.Now
之类的CIL主体。 由于Moles不是开源的,我很想知道Moles使用哪种机制来在运行时修改方法的CIL。 谁能摆脱任何光明?
Moles实现了一个CLR分析器(特别是ICorProfilerCallback接口),它允许在.NET运行时将MSIL方法体编译成汇编代码之前重写它们。 这通过JitCompileStarted回调特别完成。
在每种方法中,Moles引入了一个如下所示的绕道:
static struct DateTime { static DateTime Now { get { Func d = __Detours.GetDelegate( null, // this point null in static methods methodof(here) // current method token ); if(d != null) return d(); ... // original body } } }
设置痣时,您的代理将存储在基础__Detours字典中,该字典在执行方法时会被查找。
这就像你想要的任何程序集的包装一样,例如mscorlib
(这个例子基于mscorlib
Moles Assembly Wrapper)。 这使您有权通过编码器编写的代理替换任何.NET方法 。
这不是自动生效的。 您必须首先在此开始之前创建,将Moles XML配置文件与程序集列表添加到“Wrapper”,并通过此代码Moles从配置文件生成此集合的引用。 并且您必须在此文件中添加using namespace System.Moles
,并在函数[HostType("Moles")]