Wie kann ich verspotte ein eigenes Feld?
Ich bin wirklich neu auf spottet, und die versuche, Sie zu ersetzen ein eigenes Feld mit einem mock-Objekt. Derzeit ist die Instanz der private Bereich ist erstellt, im Konstruktor. Mein code sieht aus wie...
public class Cache {
private ISnapshot _lastest_snapshot;
public ISnapshot LatestSnapshot {
get { return this._lastest_snapshot; }
private set { this._latest_snapshot = value; }
}
public Cache() {
this.LatestSnapshot = new Snapshot();
}
public void Freeze(IUpdates Updates) {
ISnapshot _next = this.LastestSnapshot.CreateNext();
_next.FreezeFrom(Updates);
this.LastestSnapshot = _next;
}
}
Was ich versuche zu tun ist, erstellen Sie einen unit test, der behauptet ISnapshot.FreezeFrom(IUpdates)
Aufruf innerhalb Cache.Freeze(IUpdates)
. Ich vermute, ich sollte Sie ersetzen den privaten Bereich _latest_snapshot
mit einem mock-Objekt (vielleicht falsche Annahme?). Wie würde ich gehen über, während noch die Beibehaltung einer parameterlosen Konstruktor und nicht Rückgriff auf machen LatestSnapshot
's set öffentlichen?
Wenn ich mich völlig gehen über das schreiben der test der falsche Weg, dann bitte darauf hinweisen, wie gut.
Die tatsächliche Umsetzung der ISnapshot.FreezeFrom
selbst ruft eine bietet andere Methoden, mit einem tiefen objektgraphen, also bin ich nicht allzu scharf auf die Geltendmachung der Objekt graph.
Vielen Dank im Voraus.
InformationsquelleAutor Fung | 2009-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin fast unter Berufung auf Techniken, die von "Working effectively with Legacy Code":
ISnapshot
Objekt, und überschreiben Sie es in der Prüfung Unterklasse liefert eine Instanz eines mock-Objekts anstelle des realen. Diese Art der Konstruktor bekommt den richtigen Wert aus der start.ISnapshot
.InformationsquelleAutor Alex B
Ich glaube nicht, dass Sie brauchen, um mock private member-Variablen. Ist das nicht die ganze Idee der Spott, dass die öffentliche Schnittstelle für ein Objekt funktioniert wie erwartet? Private Variablen werden details zur Implementierung, die mocks nicht mit betroffenen.
Sie wollen kennen zu lernen, um das repository-Muster, die im Grunde versteckt sich die datastore-hinter eine Reihe von Schnittstellen, so dass Sie problemlos verspottet und getestet
Noch, wie Sie konstruieren, verspottet repository und übergeben es an die Verbraucher? Sie benötigen einen setter-oder constructor-parameter?
Sie würden test-repository unabhängig von der private-Feld, um sicherzustellen, dass es funktioniert
Ich meine, wenn ein Verbraucher wird nicht verspottet repository, wird der test langsam.
InformationsquelleAutor Jason
Ich bin mir nicht sicher, dass Sie tun können. Wenn Sie wollen, um zu testen
_next
dann sind Sie wahrscheinlich gehen zu müssen, übergeben Sie es als parameter und dann in Ihre unit-test-pass in ein Mock-Objekt die können Sie dann testen, mit einer Erwartungshaltung. Das ist, was ich tun würde, wenn ich versuchen, es zu tun in Moq.Als ein Beispiel dafür, was könnte ich versuchen, das Moq-framework:
Hinweis: ich habe nicht versucht zu kompilieren Sie den obigen code. Seine nur da, um ein Beispiel zu geben, wie würde ich Vorgehen, dies zu lösen.
InformationsquelleAutor mezoid
Diese Antwort könnte einfach sein, aber ein Blick in den code, gibt es eine Möglichkeit, in der
ISnapshot.FreezeFrom(IUpdates)
ist nicht genannt? Klingt wie Sie wollen, zu behaupten, etwas, das immer wahr sein.Als Jason sagt, Spott ist gedacht für Situationen, in denen Ihre Klasse hängt davon ab
SomeInterface
zu tun, ist es Arbeit, und Sie wollen, um zu testenYourClass
isoliert, aus welchem die Umsetzung derSomeInterface
Sie tatsächlich nutzen zur Laufzeit.InformationsquelleAutor matt b
Sich die Frage: was sind die äußerlich sichtbaren Wirkungen, wenn dies funktioniert?
Was passiert mit all den Snapshots? Eine option könnte initialisieren Sie den Cache mit dem ersten Snapshot von außen, sagen wir in den Konstruktor. Ein weiterer könnte sein, zu verhöhnen, was auch immer es ist, dass der Snapshot-Anrufe, die Fragen außerhalb des cache. Es hängt davon ab, was Ihnen wichtig ist, dass das passiert.
InformationsquelleAutor Steve Freeman
Könnte es zu spät sein zu reagieren. Sowieso. Ich hatte auch ähnliches problem.
Muß ich von einem eingestellten Wert von " XYZ " in meinem test-Fall. Ich löste das problem mit diesem syntex.
Im obigen Fall können wir es so machen
InformationsquelleAutor user231038
Werden Sie wahrscheinlich haben, um die Umgestaltung Ihrer Klasse, um für Sie injiziert werden mit einer anderen Abhängigkeit für ISnapshot. Ihre Klasse bleibt die gleiche Funktion.
InformationsquelleAutor murki
Können Sie fügen Sie einfach "setSnapshot(ISnapshot)" - Methode, um den Cache mit Ihr verspottet Instanz der Klasse.
Können Sie auch fügen Sie einen Konstruktor, ISnapshot.
InformationsquelleAutor Vanuan
Drehen Zwischenspeicher in eine Vorlage wie unten gezeigt.
In der Produktion-code tun:
In der test-code tun:
InformationsquelleAutor Dawit