Komponententest void-Methode, die ein neues Objekt erstellt

8

Ich habe eine Methode wie die folgende:

%Vor%

Ich möchte testen, dass der enum-Wert, der an den Konstruktor des ICommand-Objekts übergeben wird, das ich erstelle, der richtige Wert ist. Gibt es eine Möglichkeit, dies mit Rhino.Mocks zu tun?

    
alimbada 11.05.2011, 10:17
quelle

2 Antworten

11

Option 1: Verwenden Sie eine Naht

Der einfachste Weg besteht darin, diese Methode mit einer Naht zu überarbeiten:

%Vor%

Auf diese Weise können Sie die Erstellung des "neuen" Operators abfangen, indem Sie diese Klasse erweitern. Wenn dies von Hand gemacht wird, könnte es so aussehen:

%Vor%

Diese falsche Klasse kann in Ihren Testmethoden verwendet werden.

Option 2: Trennen Sie Verhalten und Daten

Ein besserer Weg wäre, die Daten vom Verhalten zu trennen. Ihr Befehl hat sowohl Daten (die Nachricht) als auch das Verhalten (diese Nachricht behandelnd). Wenn Sie eine solche Änderung in Ihrer Codebasis vornehmen dürfen: Trennen Sie dies, indem Sie beispielsweise Befehle und Befehlshandler definieren. Hier ist ein Beispiel:

%Vor%

Jetzt können Sie Abhängigkeitsinjektion verwenden, um einen Handler in die Klasse zu injizieren, die Sie testen möchten. Diese Klasse sieht jetzt so aus:

%Vor%

Da Sie nun die Daten vom Verhalten getrennt haben, ist es sehr einfach, einen falschen Befehlshandler zu erstellen (oder ihn mit Rhino-Mocks zu erstellen), der überprüft, ob der richtige Befehl an den Handler gesendet wurde. Das würde manuell so aussehen:

%Vor%

Dieser falsche Handler kann während des gesamten Unit-Testprojekts wiederverwendet werden. Ein Test mit diesem FakeHandler könnte folgendermaßen aussehen:

%Vor%

Wenn Sie die Daten vom Verhalten trennen, wird Ihre Anwendung nicht nur testfähiger. Es macht Ihre Anwendung widerstandsfähiger gegenüber Veränderungen. Zum Beispiel können übergreifende Bedenken bei der Ausführung von Befehlen hinzugefügt werden, ohne Änderungen an einem Handler im System vornehmen zu müssen. Da IHandler<T> eine Schnittstelle mit einer einzigen Methode ist, ist es sehr einfach, einen Dekorator zu schreiben, der jeden Handler umschließt und fügen Sie Dinge wie Protokollierung, Audit-Trailing, Profiling, Validierung, Transaktionsverarbeitung, Fehlertoleranzverbesserungen usw. hinzu. Sie können mehr darüber in Dieser Artikel .

    
Steven 11.05.2011, 10:36
quelle
2

Keine, die mir bekannt ist. Das nächste, was mir in den Sinn kommt, ist, eine Factory zu verwenden und dann ein StrictMock dieser Factory zu erstellen. So ähnlich:

%Vor%

Dann können Sie die Erwartungen auf Create() stellen.

HTH

    
Simone 11.05.2011 10:36
quelle

Tags und Links