2010-10-22 16 views
49

Ich stolperte über dieses Open-Source-Projekt Fake It Easy, und ich muss zugeben, es sieht sehr interessant aus, aber ich habe meine Zweifel, was sind die Unterschiede zwischen FIE-Fälschungen und sagen Moq Mocks? Ist einer für bestimmte Anwendungen besser?Sind Fälschungen besser als Mocks?

EDIT:

Was ist das über diesen neuen Rahmen, der es besser als sagen Moq machen würde?

+0

Für eine ganz andere Art von spöttischen und Stubs auf der Microsoft Mole Rahmen (http: // research.microsoft.com/en-us/projects/moles/). Moles erlaubt es, statische, versiegelte und Third-Party-Klassen zu verspotten. – softveda

Antwort

86

Um es klar, ich FakeItEasy geschaffen, so werde ich nicht definitiv sagen, ob ein Rahmen als die anderen besser ist, was ich tun kann, ist, einige Unterschiede hinweisen und motiviert warum Ich habe FakeItEasy erstellt. Funktionell gibt es keine wesentlichen Unterschiede zwischen Moq und FakeItEasy.

FakeItEasy hat keine "Verifizierbar" oder "Erwartungen" es hat Behauptungen, aber diese werden immer am Ende eines Tests explizit angegeben, ich glaube, das macht Tests leichter zu lesen und zu verstehen. Es hilft auch Anfängern, mehrere Behauptungen zu vermeiden (wo sie Erwartungen auf viele Aufrufe oder Mock-Objekte setzen würden).

Ich habe Rhino Mocks vorher benutzt und es hat mir sehr gut gefallen, besonders nachdem die AAA-Syntax eingeführt wurde. Ich mochte die flüssige API von Moq aber besser. Was mir mit Moq nicht gefallen hat war das "Mock-Objekt" wo man mock.Object überall verwenden muss, mir gefällt der Rhino-Ansatz mit "natürlichen" Mocks besser. Jede Instanz sieht und fühlt sich an wie eine normale Instanz des gefälschten Typs. Ich wollte das Beste aus beiden Welten und wollte auch sehen, was ich mit der Syntax machen konnte, wenn ich absolut freie Hände hatte. Persönlich denke ich (offensichtlich), dass ich etwas geschaffen habe, das eine gute Mischung mit dem Besten aus beiden Welten ist, aber das ist ziemlich einfach, wenn man auf den Schultern von Riesen steht.

Wie hier erwähnt wurde einer der wichtigsten Unterschiede in der Terminologie, FakeItEasy erste TDD einzuführen geschaffen wurde, und für Anfänger spöttisch und über die Unterschiede zwischen Mocks und Stubs zu kümmern vorne (die Art und Weise Sie haben würde in Rhino) ist meiner Meinung nach nicht sehr nützlich.

Ich habe eine Menge Fokus in die Ausnahmemeldungen gelegt, es sollte sehr einfach sein zu sagen, was falsch in einem Test nur eine Ausnahmebedingungsnachricht ist.

FakeItEasy hat einige Erweiterbarkeitsfunktionen, die die anderen Frameworks nicht haben, aber diese sind noch nicht sehr gut dokumentiert.

FakeItEasy ist (hoffentlich) ein wenig stärker in Mocking-Klassen, die Konstruktorargumente haben, da es einen Mechanismus zum Auflösen von Dummy-Werten zu verwenden gibt. Sie können sogar Ihre eigenen Dummy-Wertdefinitionen angeben, indem Sie eine DummyDefinition (Of T) -Klasse in Ihrem Testprojekt implementieren, die automatisch von FakeItEasy übernommen wird.

Die Syntax ist ein offensichtlicher Unterschied, welcher besser ist, ist weitgehend eine Frage des Geschmacks.

Ich bin mir sicher, dass es viele andere Unterschiede gibt, die ich jetzt vergesse (und um ehrlich zu sein, habe ich Moq nie selbst in der Produktion verwendet, so dass mein Wissen begrenzt ist), ich denke, dies sind die wichtigsten Unterschiede obwohl.

+27

+1 nichts schlägt einen Beitrag des Autors :-) – TheCodeJunkie

+1

Danke @Patrick! gute Antwort, das hilft wirklich, die Gründe hinter dem Projekt zu verstehen, du solltest so etwas in das Wiki einfügen, für Leute, die bereits ein Framework verwenden und daran interessiert sein könnten, zu wechseln :) Übrigens hast du Dogfood FIE mit deinem eigenen Produktionscode ? –

+2

Ja wir Dogfood FakeItEasy an meinem Arbeitsplatz in großen Projekten, tun dies seit über einem Jahr. –

23

Die Terminologie beim Testen kann leicht verwirrend sein. Die beste Quelle, die den Unterschied zwischen verschiedenen Konzepten erklärt, ist Mocks Aren't Stubs von Martin Fowler. Zusammenfassend ist fake ein allgemeiner Begriff, der sowohl Stubs als auch Mocks beschreibt.

+5

Lol jede Frage mit dem gefälschten oder gefälschten Tag sollte auftauchen "haben Sie Martin Fowlers Artikel gelesen" Pop-up: P –

+1

Dieser Link hat in der Tat die besten Definitionen für diese Begriffe – softveda

+0

Toller Artikel, aber Mann konnte er wor ein wenig auf Formatierung, plain html, das die ganze Bildschirmlänge überspannt, ungefärbter Code ... es macht es wirklich schwer zu lesen –

9

Die Terminologie beim Mocking kann verwirrend sein - und manchmal ist sie ziemlich unintuitiv.

Daher schlug viele Menschen eine einfachere, neue Terminologie, wo man nur Fakes, verspottet und Stubs.

Gefälschte ist der Oberbegriff für alle möglichen Arten von Test verdoppelt, egal woher sie kommen und wie sie verwendet werden.

Darüber hinaus Fälschungen sind nur entlang einer einzigen Dimension unterschieden: ob sie das Testergebnis beeinflussen oder nicht; oder mit anderen Worten: ob Sie Rückgabewerte für die Fälschung einrichten müssen, die während der Testausführung irgendwie verwendet werden, oder ob es sich um ein 'stilles'-Objekt handelt, das nur dazu dient, einige Abhängigkeiten zu erfüllen.

Stub es ist, dass 'stille' Objekt.

Mock es aktiv beteiligt Ausführung in Test

Darüber hinaus ist, gibt es keine weitere Unterscheidung - die sicherlich seine historischen Verdienste hat, ist aber jetzt weitgehend kontraintuitiv und akademisch, und es ist eine Art wirklich wichtige Konzepte der Testgetriebenen Entwicklung zu verschleiern.

Bezüglich des Vergleichs zwischen Moq und FakeItEasy: Die beiden Frameworks sind weitgehend die gleichen aus konzeptioneller Sicht - die Unterschiede nur in der API sind und in der Terminologie ...

Thomas

+0

* Wer hat die Terminologie vorgeschlagen, in der "Fälschung der Oberbegriff" ist? Ich weiß, dass die FakeItEasy-Bibliothek es so benutzt, aber das ist es. Jeder andere Autor (Fowler, Meszaros, Schöpfer anderer spöttischer Bibliotheken) benutzt entweder "Fake" für eine separate Art von Testdoppel (anders als Stubs und Mocks), oder benutzt diesen Namen überhaupt nicht (zum Beispiel gibt es nichts in jMock, EasyMock oder Mockito "Fake" genannt. –

-2

Aus meiner Sicht Gefälschte wird annulliert nicht die Moc zum Beispiel verwende ich Dev Magie Gefälschte zu fälschen DAL und Business-Schicht und in der gleichen Zeit, die ich verwende Mock in MVC für Httpcontext

var repoistory = new FakeRepository<ProductTypeForm, VendorForm>(); 
      repoistory.Save(productTypeForm); 
      this.FillDropDown(new FakeRepository<VendorForm>()); 

In der vorheriger Code Dev Magie Gefälschte das ProductTypeForm speichern und das VendorForm von Dev Magie Gefälschte abrufen und auf ProductTypeForm verknüpft, kann dieser Vorgang speichert

weitere Inforamtionen über Dev Magie Gefälschte sieht es auf CodePlex dauerhaft sein: http://devmagicfake.codeplex.com

Te Test dieser Methode Wir haben den HTTP-Kontext aussehen

var context = new Mock<HttpContextBase>(); 
var request = new Mock<HttpRequestBase>(); 

Also habe ich mit gefälschten zu verspotten arbeiten und Mock

+0

Sie scheinen mehr daran interessiert zu sein, Ihr eigenes Projekt zu bewerben, als die Frage zu beantworten ... – SamuelKDavis