2009-12-25 4 views
5

Ich möchte Moq verwenden, aber ich verwende Nhibernate und ich habe keine Schnittstellen für alle meine Modellklassen (POCO-Klassen) erstellt.Soll ich Moq verwenden, müssen alle meine Klassen eine Schnittstelle implementieren?

Muss ich für jede Klasse eine Schnittstelle erstellen, damit ich meine POCO-Klassen moqieren kann?

+1

Sie haben dies nur gefragt. Wiederholen Sie nicht http://stackoverflow.com/questions/1961778/help-with-this-unit-test-using-moq –

+0

Ich würde empfehlen, Ihre andere Frage zu schließen/zu löschen, wenn Sie können. Die Antworten hier sind, was Sie wollen. Kein Punkt, der sie dupliziert. – Finglas

+0

Lasst uns seine andere Frage schließen, anstatt diese zu schließen - das scheint klarer zu sein und könnte für andere von Wert sein. – TrueWill

Antwort

8

Sie können virtuelle Methoden vortäuschen, aber seine besten, wenn Sie eine Schnittstelle verwenden.

Grund, warum ich sagen, dass dies wie folgt:

var mockObject = new Mock<IMyObject>(); 

Wenn Sie eine virtuelle Methode verwenden, wird es:

var mockObject = new Mock<MyObject>(params...); 

Sie sind gezwungen, die Parameter für konkrete Objekte zu enthalten, aber Sie offensichtlich nicht für Schnittstellen. Alle Tests, die konkrete Klassen verwenden, müssen aktualisiert werden, wenn Sie den Konstruktor der Klasse zu einem späteren Zeitpunkt ändern möchten. Ich wurde in einer Vergangenheit damit verbrannt, also versuche, keine virtuellen Methoden mehr zum Testen zu verwenden.

Ich sollte hinzufügen, dass durch den Versuch, konkrete Typen zu verspotten, Sie den Zweck des Mocking Frameworks besiegen. Sie sollten mocking roles, not types sein. Daher ist das Arbeiten an einer Abstraktion, in diesem Fall eine Schnittstelle, eine großartige Sache.

Ein weiterer Grund ist, wie Schnittstellen funktionieren, Schnittstellen geben einen Vertrag, aber kein Verhalten an. Sie sollten verwendet werden, wenn Sie mehrere Implementierungen haben, und ich Klassen testen als ein Verhalten daher der gültige Grund, eine neue Schnittstelle einzuführen.

+0

Ich würde zustimmen, Schnittstellen zu bevorzugen. Es gibt jedoch ein paar Fälle, in denen abstrakte Klassen sinnvoller sind (wie zB das Template Method Pattern). Wie üblich sind dies Richtlinien - verwenden Sie Ihr eigenes Urteilsvermögen. – TrueWill

1

Die Klassen/Methoden, die Sie verspotten, müssen entweder eine Schnittstelle implementieren oder virtuell sein. Sie können jede Klasse/Methode testen, solange sie zugänglich ist, aber es gibt keine Möglichkeit, etwas vorzuspielen, das nicht überschrieben oder explizit implementiert werden kann.

Verwandte Themen