2010-06-11 1 views
22

Moles은 Microsoft에서 만든 격리 프레임 워크입니다. Moles의 멋진 기능은 정적/비 가상 메서드 및 밀폐 된 클래스를 모의 할 수 있다는 것입니다 (Moq와 같은 프레임 워크에서는 불가능 함). 다음은 두더지가 할 수있는 일의 빠른 데모입니다 두더지 런타임에 DateTime.Now 같은 것들의 CIL 본문을 수정할 수처럼 Moles Isolation 프레임 워크가 구현되는 방법은 무엇입니까?

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는 오픈 소스가 아니기 때문에 런타임에 메소드의 CIL을 수정하기 위해 Moles가 사용하는 메커니즘을 알고 싶습니다. 누구든지 어떤 빛을 비춰 줄 수 있습니까?

+4

Pex와 Moles의 작동 방식을 설명하는 @Peli의 3 가지 동영상을 시청하는 것이 좋습니다. 걔네들은 엄청 좋아요! [비디오 파트 1] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-13 "Microsoft PEX/MOLES 및 고급 단위 테스트 측면 1/3") ; [비디오 파트 2] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-23 "Microsoft PEX/MOLES 및 고급 유닛 테스트 측면 2/3") ; [비디오 파트 3] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-33 "Microsoft PEX/MOLES 3/3") –

답변

49

전에 두더지는 CLR 프로파일을 구현 그들이 .NET 런타임 어셈블리 코드로 컴파일되기 전에 MSIL 방법 몸을 다시 할 수 있도록 그합니다 (ICorProfilerCallback 인터페이스 특히). 이는 특히 JitCompileStarted 콜백을 통해 수행됩니다. 당신이 몰을 설정

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 사전에 저장되어있는 메소드가 실행됩니다 whenver 찾아 지는가 : 각 방법에서

은 두더지는 다음과 같습니다 우회를 소개합니다.

+4

+1 실제로 체포 어떻게 작동합니까? 나도 궁금했다. 실제로 디버그 모드에서 메소드를 재 작성하는 방법을 알고 있습니다.) – TomTom

+0

+1 또한 저 에게서요. 나는 어떻게 그 일을하고 있었는지에 대해 궁금해하고있었습니다. –

+1

Pex와 Moles의 작동 방식을 설명하는 @Peli의 3 가지 동영상을 시청하는 것이 좋습니다. 걔네들은 엄청 좋아요! [비디오 파트 1] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-13 "Microsoft PEX/MOLES 및 고급 단위 테스트 측면 1/3") ; [비디오 파트 2] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-23 "Microsoft PEX/MOLES 및 고급 유닛 테스트 측면 2/3") ; [비디오 파트 3] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-33 "Microsoft PEX/MOLES 3/3") –

0

이것은 원하는 어셈블리의 래퍼처럼 작동합니다 (예 : mscorlib).이 조립 예는 Moles Assembly Wrapper의 mscorlib입니다. 이것은 당신에게 의 힘을주는 것은 코더로 작성된 델리게이트에 의해 모든. NET 메서드를 대체합니다.

자동으로 작동하지 않습니다. 이 시작하기 전에 먼저 시작해야합니다. Moles XML 구성 "Wrapper"에 대한 어셈블리 목록과이 코드에 의해 Moles는 config 파일에서이 어셈블리의 참조를 생성합니다. 그리고 당신은이 파일에 using namespace System.Moles을 추가해야하며, 기능 [HostType("Moles")]