Wie kann ich einen Komponententest für eine Controller-Klasse schreiben, die WinForms für Ansichten verwendet?

StackOverflow https://stackoverflow.com/questions/128086

Frage

Hat jemand in der Lage gewesen, um erfolgreich Methoden Unit-Tests, die durch die Notwendigkeit sind, die mit der System.Windows.Forms.Form Klasse?

Ich habe Arbeit an einer C # WinForms-Anwendung vor kurzem, versuchen Sie es mit einer MVC-Struktur aufzubauen. Das ist schwierig genug gegeben, dass der Rahmen nicht wirklich in diesem Sinne gebaut.

Doch es kommt noch härter, wenn Sie Unit-Tests in den Mix zu werfen. Ich habe dafür zu sorgen, dass mein Controller nicht auf konkrete Ansicht Klassen gekoppelt ist, so dass ich einen Stummel / Mock für Unit-Tests verwenden kann. Aber Referenzierung der Form-Klasse irgendwo ist unvermeidbar, und diese Verfahren müssen getestet werden.

Ich habe mit Moq , weil es ein paar netten Art-Sicherheits-Features hat, und ermöglicht konkrete Typen spöttisch. Aber leider ist es mir nicht erlauben, auf eine konkrete Art Aufrufe von Methoden oder Eigenschaften zu „erwarten“, die weder virtuelle noch abstrakt sind. Und da die Form-Klasse mit Unterklassen im Sinne nicht gebaut wurde, ist dies ein großes Problem. Ich muß in die Lage, die Form-Klasse zu verspotten von echten Fenster zu verhindern erstellt werden, durch „erwarten“ Showdialog, zum Beispiel.

Also ich bin nicht in der Lage links keine Unit-Tests ausführen, die mit den Unterklassen der Form viel Interaktion zu tun, die meine Ansichten sind.

Gibt es jemanden da draußen, die erfolgreich Einheit dieser Art von Code getestet hat? Wie hast du es?

Ist das etwas, die andere spöttisches Frameworks um bekommen? Würden die String-basierten Methoden, die von anderen spöttischen Frameworks verwendet werden unterliegen den gleichen Einschränkungen? Kann ich meine eigenen explizite lange Hand Mock Klassen schreiben, oder das Fenster Verhalten zu unterdrücken, die Art und Weise zu dem Mangel an virtuellen Mitgliedern verhindert mich in der Lage aus zu sein?

Oder gibt es eine Weise, die ich nicht gedacht habe meine Klassen so zu strukturieren, dass das formular gekoppelt Code in Methoden und Klassen von trivialer Komplexität endet, so dass ich, ohne explizit Einheit wegkommen kann sie testen, ohne mein Gewissen schlagen sie mich für sie?

War es hilfreich?

Lösung

Die beste Methode, die ich gehört habe, von / für Unit-Tests mit GUI-Elementen ist das Humble Dialog Muster / Methode. Im Wesentlichen sind die Formulare nur die Schnittstelle, und alle die eigentliche Arbeit in anderen Klassen durchgeführt. Sie Einheit, die Klassen testen, die die Funktionalität bereitstellen, und dann nur in diesen Klassen zu den entsprechenden Methoden, um Ihre GUI-Ereignisse binden.

Andere Tipps

Mein aktueller Gedanke ist, dass ich Zusammensetzung verwenden muß möglicherweise eher als Erbe mit der Form-Klasse, die Steuerungen von ihm zu entkoppeln.

Dies hat den Nachteil, dass jedes Mal, ich brauche ein Mitglied der Klasse Formular verwenden, die ich nicht für planten, muss ich es ausdrücklich meiner Ansicht Schnittstelle hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top