Unit-test zu überprüfen, ob eine Basis-Methode der Klasse aufgerufen wird
Ich habe eine base-Klasse:
public abstract class MyBaseClass
{
protected virtual void Method1()
{
}
}
und eine abgeleitete Klasse:
public class MyDerivedClass : MyBaseClass
{
public void Method2()
{
base.Method1();
}
}
Ich möchte schreiben Sie einen unit-test für Method2
um zu überprüfen, dass es Anrufe Method1
auf die Basisklasse. Ich bin mit Moq wie mein mocking-library. Ist das möglich?
Stieß ich auf einen Zusammenhang, SO link:
Mocking eine Basisklasse Aufruf der Methode mit Moq
in der die 2. Antwort es vermuten lässt, kann erreicht werden durch Einstellung CallBase
- Eigenschaft auf true fest auf dem mock-Objekt. Aber es ist nicht klar, wie diese würde es ermöglichen, den Aufruf der Basisklassenmethode (Method1
im obigen Beispiel), überprüft werden.
Schätzen jede Hilfe bei diesem.
- Warum ist es eine Voraussetzung, dass die Basis-Methode aufgerufen wird? Wenn Sie verspotten es, alle, die Sie überprüfen möchten, dass der mock ruft die base-Methode. Sie sind nur zu überprüfen, dass die
base.
syntax funktioniert oder brauchen Sie vererbten Klassen zu nennen, die Basis? - Auch, Sie sollte nur die Prüfung, dass die Ergebnisse korrekt sind. Die Prüfung, dass eine bestimmte Implementierung verwendet wird, ist im Allgemeinen ein Hinweis auf ein schlechtes design.
- Hat die Basis-Methode Nebenwirkungen haben, dass man überprüfen kann?
- Ja, es gibt Nebenwirkungen, die verifiziert werden kann und ich denke, das ist wohl die route, die ich nehmen werde. Ich wurde gerade gefragt, ob es tatsächlich möglich ist mit mocking-Bibliotheken wie Moq, um zu überprüfen, dass eine Basis-Methode der Klasse aufgerufen, die eine abgeleitete Klasse.
- Möglicherweise, aber es macht viel mehr Sinn, um zu überprüfen, die Ergebnisse eher als die Umsetzung. Plus es gibt Ihnen die bis zu ändern Sie die Implementierung, ohne neu zu schreiben Ihre tests (solange die Ergebnisse korrekt sind).
- In Ihrer aktuellen Umsetzung, kann man nicht abfangen, wird der Anruf mit Moq, aber da
MyDerivedClass
nicht umsetzenMethod1
, Sie könnten entfernen Sie diebase.
Präfix aus dem Anruf-und dann würden Sie in der Lage sein, um den Aufruf abzufangen. Dies ist wahrscheinlich die richtige Sache zu tun sowieso, da sonst Sie schneiden abgeleitete Implementierungen vonMethod1
aus, das fühlt sich falsch an. Weiter Lesen: stackoverflow.com/a/31201708/592182 und stackoverflow.com/a/31062287/592182 - Möglich, Duplikat der Original-Methode immer wieder aufgerufen Moq sogar nach CallBase = true/false
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unit-tests sollten überprüfen Verhalten, nicht Umsetzung. Es gibt mehrere Gründe dafür:
Du könnte in der Lage, die in Haken oder erstellen von mocks, die prüfen, ob der Basis-Methode aufgerufen wurde, aber ist Ihnen wirklich wichtig wie die Antwort wurde erzielt, oder haben Sie Sorge, dass die Antwort Recht?
Wenn die spezielle Implementierung, die Sie benötigen hat Nebenwirkungen, die Sie überprüfen können, dann , dass ist, was Sie sollten überprüfen.
class Query
AnrufeExecute
welche selbst nennt zwei MethodenWhere
undSort
. Sagen, ich bin eine neue Miete, und ich gehe, und entfernen Sie den AufrufSort
jetzt meine Klasse ist nicht die erwartete Leistung.Sort
Methode aufgerufen wird, oder ob eine andereSort
- Methode aufgerufen wird, oder einfach nur sortiert in dieExecute
Methode.Spott der Basisklasse aus der Sicht der abgeleiteten Klasse nicht möglich. In deinem einfachen Beispiel, würde ich vorschlagen, eine der beiden Optionen.
Option 1: Im Fall, dass
MyDerivedClass
sollte wirklich nicht kümmern, wasMyBaseClass
liegt, dann dependency injection! Yay Abstraktion!Anderswo im test-land...
Option 2: Im Fall, dass
MyDerivedClass
MUSS wissen, wasMyBaseClass
tut, dann test, dassMyBaseClass
ist, das richtige zu tun.In alternative test land...
Was Sie beschreiben, ist nicht ein test von code, sondern ein test über das Verhalten der Sprache. Das ist in Ordnung, weil es ein guter Weg, um sicherzustellen, dass die Sprache sich so verhält, wie wir denken, es tut. Ich habe zu schreiben, viele kleine Konsole apps, wenn ich lernen mußte. Ich wünschte, ich hätte bekannt, etwa unit-testing und dann, weil es einen besseren Weg, um darüber zu gehen.
Aber sobald Sie haben es getestet und bestätigt, dass die Sprache sich so verhält, wie Sie erwarten, ich würde nicht halten Sie schreiben von tests für, die. Sie können nur testen Sie das Verhalten Ihres Codes.
Hier ein echt einfaches Beispiel:
Unit-test