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.
Sie haben dies nur gefragt. Wiederholen Sie nicht http://stackoverflow.com/questions/1961778/help-with-this-unit-test-using-moq –
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
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