2008-12-08 14 views
17

Ich habe moq verwendet, um Objekte in meinen Komponententests zu mocksen, und ich habe auf der Seite über moq gesehen, dass es in der Lage ist, sowohl Klassen als auch Schnittstellen zu überspielen.Was ist der Unterschied zwischen dem Moq-ing einer Klasse oder Schnittstelle?

Ich hatte eine Diskussion mit einem meiner Arbeitskollegen neulich und sie sagten, dass es nie einen Grund gibt, Klassen zu verspotten, und ich sollte nur Schnittstellen vortäuschen.

Ich hatte nicht wirklich eine Antwort darauf ... und ich kann auch keine Antwort auf die Moq-Seite finden.

Ist es wahr, dass man nie Klassen spotten sollte? Ich würde nein sagen, wenn das stimmt, dann würde Moq es nicht einmal zulassen ... Also gibt es dann eine Zeit, in der es besser ist, eine Klasse über eine Schnittstelle zu verspotten? Was ist der Unterschied zwischen der Verspottung einer Klasse und der Verspottung einer Schnittstelle? Oder ist es wirklich nur eine Vorliebe?

Antwort

16

Die Verspottung einer Klasse ist absolut gültig. Mit MoQ können Sie jedoch nur virtuelle Methoden und Eigenschaften für eine Klasse vortäuschen.

Es ist nützlich, wenn Sie abstrakte Basisklassen anstelle von Schnittstellen oder Klassen mit Standardimplementierungen und virtuellen Erweiterungen als Erweiterungspunkte haben. Es gibt viele Fälle, in denen Sie keinen Zugriff auf den Quellcode von Klassen haben, die Sie nachahmen müssen. Es gibt viele Beispiele im .NET-Framework, z.B. Mitgliedschaftsanbieter

1

Wenn die Klasse keine Schnittstelle implementiert oder wenn das Mocking-Framework partielle Mocks zulässt, dann sollten Sie in der Lage sein, die Klasse zu verspotten. Im ersten Fall, weil es keine Schnittstelle zum Nachahmen gibt. In diesem Fall können Sie bereits vorhandenes Verhalten von der Klasse erben, die Sie nicht ausspionieren möchten.

Normalerweise möchten Sie jedoch, dass Ihre Klassen von Schnittstellen abhängig sind, wenn sie verfügbar sind. In diesem Fall müssen Sie keine Klasse vortäuschen, die die Schnittstelle implementiert. Sie sollten nur die Schnittstelle selbst verspotten, um Abhängigkeiten in Ihrem Test zu vermeiden, die in der getesteten Klasse nicht existieren.