2008-09-26 12 views
7

Ich fange an, mich mit der Idee von Fälschungen, Stubs, Mocks und dynamischen Mocks anzufreunden. Aber ich bin immer noch etwas unsicher in meinem Verständnis, wann ich partielle Mocks verwenden soll.Wann man partielle Mocks benutzt?

Es scheint, dass, wenn Sie planen, einen Dienst zu verspotten und auf einen partiellen Schein zurückgreifen müssen, dann ist es ein Zeichen von schlechtem Design. Ist es, dass teilweise Mocks hauptsächlich dafür sind, alten Code unter Testabdeckung zu bekommen?

Auf der anderen Seite sagen, dass ich eine Klasse testen, die eine Reset() -Methode hat. Wenn ich bereits in einem separaten Test bestätigt habe, dass die Reset() -Methode funktioniert, und ich einige Funktionen der Klasse habe, die mit einem Aufruf dieser Methode enden sollte, ist es ein schlechter Testentwurf, ein teilweises Mock-up des Objekts durchzuführen und auszuführen testet gegen den partiellen Mock und definiert eine Expectation auf der Reset() -Methode.

Ich habe derzeit mehrere Tests auf diese Weise eingerichtet, wird diese Art von Sache mich später in Schwierigkeiten bringen?

Antwort

1

Mein Verständnis von partiellen Spott war, dass es zum Spott abstrakte Klassen war, mit nur die abstrakten Methoden verspottet werden, und die bestehenden konkreten Methoden bleiben so wie sie sind?

2

Sein gutes Design, imho. Was passiert, wenn jemand hinter Ihnen her kommt und Ihre Methode ändert und den Anruf zu Reset entfernt? (Übrigens, warum gibt es so viele Dinge in deinen Objekten?) Du wirst vielleicht nie wissen, dass sie es vermasselt haben, bis du die Produktion erreicht hast. Indem Sie sich darüber lustig machen und bei diesem Methodenaufruf behaupten, können Sie sicher sein, dass niemand bei der Pflege Ihres Codes versagt.

+0

Will, ich verstehe nicht ganz, was Sie sagen wollen. Ich frage, wann ich Partial Mocks verwenden soll, nicht wie Mocks funktionieren. –

+0

Es schien, als ob Sie über die Differenzierung unklar waren. Nahm das an, jetzt beantworte ich nur deine Frage. – Will

1

Man könnte argumentieren, dass alle Mocks "teilweise" sind, weil sie eine Schnittstelle nicht vollständig implementieren. Wenn Sie versuchen, eine sehr fokussierte Funktionalität zu testen, sollten Sie nur die Aspekte von unterstützenden Klassen vortäuschen, die notwendig sind, um die Funktionalität zu testen, die Sie gerade testen.

Dies wird Ihren Test von anderen Tests entkoppelt, was nett ist.

2

In Ihrem Beispiel klingt es wie die Reset Methode ist ein Implementierungsdetail und durch die Verwendung einer partiellen Mock, sind Sie in Gefahr, Ihren Test an die Implementierung der Klasse zu koppeln. Dies wird Ihren Test spröder machen, als es sein muss.

Ich denke auch, dass es Tests verwirrender macht, wenn ein Objekt einige Methoden mit realen Implementierungen und einige mit Stub-Implementierungen hat. Es ist nur noch eine Sache, an die Sie sich erinnern sollten, wenn Sie später zu einem Test zurückkehren.

Können Sie entweder (a) statusbasierte Tests verwenden, um zu bestätigen, dass der Zustand des Objekts so ist, wie Sie erwarten, nachdem die reelle Reset-Methode intern aufgerufen wurde; oder (b) interaktionsbasierte Tests verwenden, um zu verifizieren, dass die relevanten Aufrufe kollaborierender Objekte als Ergebnis der realen Methode Reset vorgenommen wurden?

Sie könnten Test Smell: Mocking concrete classes von mockobjects.com nützlich finden.