Aktualisierte Version der FrageAufnahme der Interaktion an einem Wendepunkt unter Verwendung eines Mocking-Frameworks. Moq
Hallo.
Meine Firma hat ein paar Legacy-Code-Basen, die ich hoffe, sie zu testen, sobald sie auf .NET 3.5 migrieren. Ich habe Moq als mein Mocking Framework ausgewählt (ich habe mich sofort in die knackige Syntax verliebt).
Ein gängiges Szenario, von dem ich in Zukunft viel zu erwarten habe, ist, wo ich ein Objekt sehe, das mit anderen Objekten interagiert.
Ich kenne die Arbeiten von Michael Feathers und ich bin gut darin, Wendepunkte zu identifizieren und anständige Größen zu isolieren. Extrahieren und Überschreiben ist König.
Es gibt jedoch eine Funktion, die mein Leben viel einfacher machen würde.
Stellen Sie sich vor, dass Component1 mit Component2 interagiert. Component2 ist eine seltsame serielle Schnittstelle zu einem zentralen Brandherd oder eine solche mit viel Byte-Inspektion, Casting und Zeigermanipulation. Ich möchte Component2 nicht verstehen, und seine von Component1 konsumierte Legacy-Schnittstelle bringt viel Gepäck mit sich.
Was würde ich tun, ist die Schnittstelle von Component2 von Component1 verbraucht zu extrahieren und dann etwas tun, wie folgt aus:
component1.FireCentral = new Mock<IComponent2> (component2);
Ich bin eine normale Mock zu schaffen, aber ich bin pasing in einer Instanz die echte Component2 als Konstruktorargument in das Mock-Objekt. Es scheint, als würde ich meinen Test abhängig von Component2 durchführen, aber ich habe nicht vor, diesen Code beizubehalten. Dies ist Teil des Rituals "Place Object under Test".
Jetzt würde ich das reale System (mit einem physischen Feuer zentral verbunden) und dann mit meinem Objekt interagieren.
Was ich dann wünschen würde, ist die Mock zu überprüfen, um ein Protokoll zu sehen, wie component1 mit component2 interagiert (mit dem Debugger einige Sammlung von Zeichenfolgen auf dem Mock zu überprüfen). Und noch besser, der Mock könnte eine Liste von Erwartungen (in C#) liefern, die dieses Verhalten in einem Mock erzeugen würden, der nicht von Component2 abhängt, den ich dann in meinem Testcode verwenden würde.
Kurz gesagt. Verwenden des Mocking-Frameworks, um die Interaktion aufzuzeichnen, sodass ich sie in meinem Testcode wiedergeben kann.
alte Version Frage
Hallo.
Bei der Arbeit mit Legacy-Code und mit vielen Utility-Klassen frage ich mich manchmal, wie eine bestimmte Klasse in einer Reihe von Szenarien von ihrer Umgebung beeinflusst wird. Ein Fall, an dem ich heute Morgen arbeitete, beinhaltete das Unterklassifizieren eines regulären MemoryStream, so dass er seinen Inhalt bei Erreichen einer bestimmten Größe in eine Datei ablegen würde.
// TODO: Remove
private class MyLimitedMemoryStream : MemoryStream
{
public override void Write(byte[] buffer, int offset, int count)
{
if (GetBuffer().Length > 10000000)
{
System.IO.FileStream file = new FileStream("c:\\foobar.html",FileMode.Create);
var internalbuffer = GetBuffer();
file.Write(internalbuffer,0,internalbuffer.Length);
}
base.Write(buffer, offset, count);
}
}
(und ich benutzte einen Haltepunkt hier, um das Programm zu beenden, nachdem die Datei geschrieben wurde). Das hat funktioniert, und ich habe festgestellt, welches Webformular (Webpart -> Webpart -> Webpart) falsch gerendert wird. Allerdings hat memorystream eine Reihe von Schreib- und Schreibzeilen.
Kann ich ein Mocking-Framework verwenden, um schnell einen Überblick darüber zu erhalten, wie auf eine bestimmte Instanz reagiert wird? Irgendwelche Tricks dort? Wir verwenden Rhino Mocks.
Ich sehe dies als eine große Assett in der Arbeit mit Legacy-Code. Insbesondere, wenn aufgezeichnete Aktionen in einem Szenario leicht als neue Erwartungen/Akzeptanzkriterien für dasselbe Szenario in einem Komponententest repliziert werden können.
Jeder Eingang wird geschätzt. Danke fürs Lesen.
Haben Sie etwas für diese seit 2009 finden? Ich will das für die JVM. –
Nein, der Typ des Mock-Frameworks, der das Verhalten einer Abhängigkeit umschließt und aufzeichnet, entgeht mir immer noch. Es könnte Zeit für einen weiteren ernsthaften Blick sein. – Tormod
Hier ist die gleiche Frage für Java gestellt. http://stackoverflow.com/questions/16400897/record-method-calls-in-one-session-for-replaying-in-future-test-sessions Eine der Antworten verweist auf eine Kern-Implementierung. https://gist.github.com/dfreeman/5563829 –