15.02.2013 Aufrufe

b2aat6n

b2aat6n

b2aat6n

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Listing 2<br />

Rückgabedaten vom Typ IEnumerable nutzen.<br />

public void Flow() {<br />

var input = Input();<br />

var x1 = A(input);<br />

var x2 = B(x1);<br />

var result = C(x2);<br />

}<br />

foreach(var value in result) {<br />

...<br />

}<br />

public IEnumerable Input() {<br />

yield return "Äpfel";<br />

yield return "Birnen";<br />

yield return "Pflaumen";<br />

}<br />

public IEnumerable A(IEnumerable input) {<br />

foreach (var value in input) {<br />

yield return string.Format("({0})", value);<br />

}<br />

}<br />

public IEnumerable B(IEnumerable input) {<br />

foreach (var value in input) {<br />

yield return string.Format("[{0}]", value);<br />

}<br />

}<br />

public IEnumerable C(IEnumerable input) {<br />

foreach (var value in input) {<br />

yield return string.Format("-{0}-", value);<br />

}<br />

}<br />

Listing 3<br />

Die Stages syntaktisch koppeln.<br />

public static IEnumerable A(this IEnumerable input) {<br />

foreach (var value in input) {<br />

yield return string.Format("({0})", value);<br />

}<br />

}<br />

...<br />

var result = Input().A().B().C();<br />

dieser Tests ist eine Action, die auf<br />

einer Instanz der Klasse ausgeführt wird,<br />

die zu testen ist. Wenn also die Klasse KundeViewModel<br />

überprüft werden soll, wird<br />

für jede Property eine Action erzeugt. Sind die Actions erzeugt,<br />

müssen sie nur nach ein ander ausgeführt<br />

werden. Dabei soll jede Action eine neue<br />

Instanz der zu testenden Klasse erhalten.<br />

Andernfalls könnte es zu Seiteneffekten<br />

beim Testen der Properties kommen.<br />

Funktionseinheiten identifizieren<br />

Die erste Aufgabe ist also das Ermitteln der<br />

zu testenden Properties. Eingangspara -<br />

meter in diese Funktionseinheit ist der Typ,<br />

für den die INotifyPropertyChanged-Implementierung<br />

überprüft werden soll. Das Ergebnis<br />

der Flowstage ist eine Aufzählung<br />

der Property-Namen.<br />

static IEnumerable<br />

FindPropertyNames(this Type type)<br />

LÖSUNG<br />

An dieser Stelle fragen Sie sich möglicherweise,<br />

warum ich die Property-Namen<br />

als Strings zurückgebe und nicht etwa eine<br />

Liste von PropertyInfo-Objekten. Schließlich<br />

stecken in PropertyInfo mehr Informationen,<br />

insbesondere der Typ der Property,<br />

den ich später ebenfalls benötige. Ich habe<br />

mich dagegen entschieden, weil dies das<br />

Testen der nächsten Flowstage deutlich<br />

erschwert hätte. Denn diese hätte dann auf<br />

einer Liste von PropertyInfo-Objekten arbeiten<br />

müssen. Und da PropertyInfo-Instanzen<br />

nicht einfach mit new hergestellt werden<br />

können, wären die Tests recht mühsam geworden.<br />

Nachdem die Property-Namen bekannt<br />

sind, kann die nächste Flowstage dazu den<br />

jeweiligen Typ ermitteln. Die Flowstage erhält<br />

also eine Liste von Property-Namen<br />

sowie den Typ und liefert eine Aufzählung<br />

von Typen.<br />

static IEnumerable FindPropertyTypes(<br />

this IEnumerable propertyNames,<br />

Type type)<br />

Im Anschluss muss für jeden Typ ein Objekt<br />

instanziert werden. Diese Objekte werden<br />

später im Test den Properties zuge -<br />

wiesen. Die Flowstage erhält also eine Liste<br />

von Typen und liefert für jeden dieser Typen<br />

eine Instanz des entsprechenden Typs.<br />

static IEnumerable GenerateValues(<br />

this IEnumerable types)<br />

Dann wird es spannend: Die Actions<br />

müssen erzeugt werden. Dabei lässt es sich<br />

leider nicht vermeiden, die Property-Namen<br />

aus der ersten Stage nochmals zu verwenden.<br />

Die Ergebnisse der ersten Stage<br />

fließen also nicht nur in die unmittelbar<br />

nächste Stage, sondern zusätzlich auch<br />

noch in die Stage, welche die Actions erzeugt.<br />

Die Namen der Properties werden<br />

benötigt, um mittels Reflection die jeweiligen<br />

Setter aufrufen zu können.<br />

static IEnumerable<br />

GenerateTestMethods(this IEnumerable<br />

values, IEnumerable propertyNames,<br />

Type type)<br />

Der letzte Schritt besteht darin, die gelieferten<br />

Actions auszuführen. Dazu muss jeweils<br />

eine Instanz der zu testenden Klasse erzeugt<br />

und an die Action übergeben werden.<br />

Abbildung 2 zeigt den gesamten Flow.<br />

Die einzelnen Flowstages sind als Extension<br />

Method implementiert. Der Flow selbst<br />

wird in der öffentlichen Methode NotificationTester.Verify<br />

zusammengesteckt. Testen<br />

www.dotnetpro.de dotnetpro.dojos.2011 11

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!