Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Der Verlockung widerstehen: Shims mit Microsoft...

Der Verlockung widerstehen: Shims mit Microsoft Fakes sinnvoll genutzt

Auf die Erkenntnis hin, dass sich mit dem Microsoft Fakes Isolation Framework (kurz: Microsoft Fakes) sogar Umleitungen für Methoden implementieren lassen, in deren Quellcodebesitz man nicht ist, haben findige Entwickler bereits probiert, es zum Cheaten in Egoshootern einzusetzen. Das wäre natürlich auch einfacher, als Code disassemblieren zu müssen, Hooks zu implementieren und dergleichen mehr an Aufwand zu betreiben, statt zu lernen, wie man besser darin wird, das Spiel zu spielen. Aber Spaß beiseite, Microsoft Fakes kann natürlich nur im Kontext von Unit Tests eingesetzt werden. Wir werden in der Session selbst einen kleinen Blick unter die Haube riskieren, um zu schauen warum das so ist, und wie Fakes arbeitet. Außerdem stellen wir uns die Frage, wie Detouring funktioniert und uns Szenarien überlegen, in denen Shims Sinn ergeben. Auch auf Stubs wird schließlich ein Blick geworfen – der Vollständigkeit halber. Denn wie man mittels Interfaces Abhängigkeiten isoliert, weiß ja mittlerweile jeder... oder?

Eine Videoaufzeichnung des Vortrags gibt es hier:

[YouTube]
https://www.youtube.com/watch?v=lG4GsHOd-6g

[Channel9]
https://channel9.msdn.com/Events/microsoft-techncial-summit/Microsoft-Technical-Summit-2014/Der-Verlockung-widerstehen-Shims-mit-Microsoft-Fakes-sinnvoll-genutzt

Avatar for Christian Jacob

Christian Jacob

November 11, 2014
Tweet

More Decks by Christian Jacob

Other Decks in Programming

Transcript

  1. Peter Provost Sr. Program Manager Lead Microsoft Corporation Fakes makes

    it easier and faster to create well-isolated unit tests when you do have systems that are not necessarily testable.
  2. KRITERIUM STUB SHIM Maximale Performance  () Abstrakte und virtuelle

    Methoden  Schnittstellen  Interne Typen   Statische Methoden  Sealed Typen  Private Methoden 
  3. Komposition fördert die lose Kopplung und die Testbarkeit eines Systems

    und ist oft flexibler. Clean Code Developer Roter Grad cleancodedeveloper.de
  4. DEMO [TestMethod] public void GameListNotEmptyTestStubs() { var testfilePath = "GameList.txt";

    var content = "Tic Tac Toe"; // Notice, that there is no real file access happening here var fileSystem = new StubIFileSystem() { ReadAllTextString = filename => { return content; } }; bool actual = FileHelper.IsEmpty(fileSystem, testfilePath); Assert.IsFalse(actual); } Stubs
  5. DEMO Shims [TestMethod] public void GetAgeTestShim() { using (ShimsContext.Create()) {

    ShimDateTime.NowGet = () => new DateTime(2011, 1, 1); var birthdate = new DateTime(1993, 1, 1); var expected = 18; var actual = DateTimeHelper.GetAge(birthdate); Assert.AreEqual(expected, actual); } }
  6. A: Microsoft solved this issue using the darkest eldritch magic.

    Q: How do Microsoft Fakes' shims actually work internally? A: Read http://research.microsoft.com/pubs/131693/moles.pdf
  7. A: This is a Fakes limitation in Visual Studio 2012.

    In Visual Studio 2013, we generate a custom delegate type directly in the fakes assembly instead of relying on just the pre- defined types. Q: Shimming methods with more than 2 out arguments won't work. Is this a known limitation with Fakes?
  8. Kein Fakes in Visual Studio Express Auf Shims besser verzichten

    Code Refactoring und Schnittstellen sind der bessere Weg Wenn Fakes Moles ersetzt, wo ist dann eigentlich Pex?
  9. If you disable the Portable Class Library restriction in Code

    Digger, then you are leaving the area where the Code Digger has been designed for to work. Nikolai Tillmann Microsoft Principle RSDE Microsoft Corporation
  10. Fakes referenziert Microsoft.QualityTools.Testing.Fakes.dll. Einchecken hilft nicht und resultiert lediglich in

    einer NotSupportedException bei nicht unterstützten Editionen. Kategorien helfen, um Fakes-Tests auf nicht unterstützen Systemen herauszufiltern. Alternativ: Fakes Tests in eigene Projekte auslagern.