b2aat6n
b2aat6n
b2aat6n
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