2010-01-11 9 views
5

Sagen wir eine Methode, die wie folgt aussieht:C#, NUnit: Wie mit der Prüfung von Ausnahmen behandeln und verzögerte Ausführung

public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies) 
{ 
    if(subjects == null) 
     throw new ArgumentNullException("subjects"); 

    foreach(var puppy in puppies) 
     yield return puppy.Grow(); 
} 

Wenn ich testen, dass dadurch:

Puppy[] puppies = null; 
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll()); 

Die Test wird fail sagen, dass es

Erwartet: <System.ArgumentNullException>
Aber war: null

kann ich das beheben, dass der Test

durch Änderung
Puppy[] puppies = null; 
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll().ToArray()); 

Ist das nur, wie Sie es normalerweise tun würde? Oder gibt es eine bessere Möglichkeit, den Test zu schreiben? Oder vielleicht eine bessere Möglichkeit, die Methode selbst zu schreiben?


versucht, das gleiche mit dem eingebauten in Select Methode zu tun, und es scheiterte auch ohne ToArray oder so etwas, so offensichtlich ist es etwas, was Sie dagegen tun können ... ich nicht nur tun weiß was: p

Antwort

3

Der Test ist in Ordnung - Ihr Code ist nicht. Sie sollten den Code machen, sobald die Ausnahme werfen, wie es durch die Spaltung des Verfahrens in Hälfte genannt wird,:

public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies) 
{ 
    if(subjects == null) 
     throw new ArgumentNullException("subjects"); 

    return GrowAllImpl(puppies); 
} 

private IEnumerable<Dog> GrowAllImpl(this IEnumerable<Puppy> puppies) 
{ 
    foreach(var puppy in puppies) 
     yield return puppy.Grow(); 
} 
+0

Aaaah, so dass deshalb alle Ihre Methoden so aussehen in der Bibliothek von Ihnen ... Das macht Sinn! Nicht sicher, ob es mir gefällt ... hehe. Muss sagen, ich bevorzuge es in einer Methode zu behalten. Aber gut. Ich nehme an, ich werde mich nach einer Weile daran gewöhnen :) – Svish

+1

Es ist ein unglücklicher Nebeneffekt von Iterator-Blöcken. Siehe http://msmvps.com/blogs/jon_skeet/archive/2008/03/02/c-4-idea-iterator-blocks-and-parameter-checking.aspx –

+0

Genau. Ja, ich habe irgendwie verstanden, warum es passiert ist. Nur nicht, wie der empfohlene Weg, damit umzugehen war :) – Svish

Verwandte Themen