2010-01-11 14 views
5

że mamy metodę, która wygląda tak:C#, NUnit: Jak radzić sobie z testami wyjątków i wykonanie odroczonej

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

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

Gdybym przetestować, że w ten sposób:

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

Test nie powiedzie się powiedzenie, że

Oczekiwany: <System.ArgumentNullException>
Ale było: null

mogę naprawić zmieniając test do

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

Czy to tylko jak byś zwykle zrobić? Czy istnieje lepszy sposób na napisanie testu? A może lepszy sposób na napisanie samej metody?


próbował zrobić to samo z wbudowanego Select metody, a nie udało się nawet bez ToArray lub coś podobnego, więc najwyraźniej nie jest coś, co można zrobić ... Po prostu nie wiesz co: p

Odpowiedz

3

Test jest w porządku - twój kod nie jest. Należy uczynić kod rzucić wyjątek tak szybko, jak to się nazywa, dzieląc na pół metody:

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

aaaa, więc dlatego wszystkie metody wyglądać, że w tej bibliotece twojej ... ma sens! Nie jestem pewien, czy mi się to podoba ... hehe. Muszę powiedzieć, że wolę zachować ją w jednej metodzie. Ale no cóż. Przypuszczam, że przywyknę do tego po chwili :) – Svish

+1

To niefortunny efekt uboczny bloków iteratora. Zobacz http://msmvps.com/blogs/jon_skeet/archive/2008/03/02/c-4-idea-iterator-blocks-and-parameter-checking.aspx –

+0

Dokładnie. Tak, zrozumiałem, dlaczego to się stało. Po prostu nie jak zalecany sposób radzenia sobie z tym było :) – Svish