2010-06-11 14 views
22

Moles to framework izolacyjny stworzony przez firmę Microsoft. Fajną cechą Moles jest to, że potrafi "kpić" z metod statycznych/nie-wirtualnych i klas zapieczętowanych (co nie jest możliwe w przypadku frameworków takich jak Moq). Poniżej jest szybkie demonstracja tego, co może zrobić Moles:W jaki sposób zaimplementowano strukturę izolacji 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); 

Wygląda Moli jest w stanie zmodyfikować ciało CIL rzeczy jak DateTime.Now przy starcie. Ponieważ Moles nie jest open-source, jestem ciekawy, który mechanizm Moles używa, aby zmodyfikować CIL metod w środowisku wykonawczym. Czy ktoś może rzucić jakiekolwiek światło?

+4

Gorąco polecam oglądanie tych 3 filmów @Peli wyjaśniających, jak działają Pex i Moles. Oni są bardzo dobrzy! [Część wideo 1] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-13 "Microsoft PEX/MOLES i zaawansowane aspekty testowania jednostek 1/3") ; [Część wideo 2] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-23 "Microsoft PEX/MOLES i aspekty zaawansowanych testów jednostkowych 2/3") ; [Część wideo 3] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-33 "Microsoft PEX/MOLES 3/3") –

Odpowiedz

49

Moles implementuje CLR Profiler (w szczególności interfejs ICorProfilerCallback), który pozwala przepisać ciał metod MSIL, zanim zostaną one kompilowane do kodu maszynowego przez środowisko .NET. Odbywa się to w szczególności przez wywołanie zwrotne JitCompileStarted.

W każdej metody, krety wprowadza objazd, który wygląda tak:

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 
     } 
    } 
} 

Po ustawieniu kreta, Twój delegat jest przechowywany w słowniku leżącej __Detours który dostaje spojrzał w górę whenver metoda jest wykonywana.

+4

+1 za faktyczne koszty JAK to działa. Byłem też ciekawy. Miło wiedzieć, że w rzeczywistości jest to sposób na przepisanie metody w trybie debugowania;) – TomTom

+0

+1 ode mnie - zastanawiałem się, jak to zrobili i do tego doszli - ma również sens. –

+1

Gorąco polecam oglądanie tych 3 filmów @Peli wyjaśniających, jak działają Pex i Moles. Oni są bardzo dobrzy! [Część wideo 1] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-13 "Microsoft PEX/MOLES i zaawansowane aspekty testowania jednostek 1/3") ; [Część wideo 2] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-23 "Microsoft PEX/MOLES i aspekty zaawansowanych testów jednostkowych 2/3") ; [Część wideo 3] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES--advanced-Unit-Testing-aspects-33 "Microsoft PEX/MOLES 3/3") –

0

Działa to jak opakowanie do dowolnego zestawu, na przykład mscorlib (ten przykład bazuje na opakowaniu do montażu Moles z mscorlib). To daje moc do zastąpienia dowolnej metody .NET przez delegata napisanego przez kodera.

To nie działa automagicznie. Najpierw należy utworzyć przed uruchomieniem, plik Moles konfiguracja XML plik z listą Złożenia do "Opakowania" i tym kodem Moles wygenerować odwołanie tego gromadzi z pliku konfiguracyjnego. I trzeba w tym pliku dodać using namespace System.Moles, a przed funkcją [HostType("Moles")]

Powiązane problemy