2010-01-11 24 views
5

Giả sử chúng ta có một phương pháp mà trông như thế này:C#, NUnit: Làm thế nào để đối phó với thử nghiệm của trường hợp ngoại lệ và thực hiện chậm

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

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

Nếu tôi kiểm tra rằng bằng cách làm này:

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

Các kiểm tra sẽ thất bại và nói rằng nó

dự kiến: <System.ArgumentNullException>
Nhưng là: null

tôi có thể khắc phục điều đó bằng cách thay đổi thử nghiệm để

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

Đây có phải là chỉ là cách bạn thường sẽ làm điều đó? Hay có cách nào tốt hơn để viết bài kiểm tra? Hoặc có thể là cách tốt hơn để tự viết phương pháp?


Cố gắng làm tương tự với các built-in Select phương pháp, và nó đã thất bại ngay cả khi không một ToArray hoặc bất cứ điều gì như thế, vì vậy dường như có cái gì đó bạn có thể làm gì về nó ... Tôi chỉ không biết: p

Trả lời

3

Bài kiểm tra là tốt - mã của bạn không phải. Bạn nên làm cho đoạn code ném ngoại lệ ngay sau khi nó được gọi là, bằng cách phân chia phương pháp này trong nửa:

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, vì vậy đó là lý do tại sao tất cả các phương pháp của bạn trông như thế trong thư viện của bạn ... Làm cho cảm giác! Không chắc tôi có thích nó không ... hehe. Phải nói rằng tôi thích giữ nó trong một phương pháp. Nhưng tốt thôi. Tôi cho rằng tôi sẽ quen với nó sau một thời gian :) – Svish

+1

Đó là một tác dụng phụ không may của các khối lặp. Xem http://msmvps.com/blogs/jon_skeet/archive/2008/03/02/c-4-idea-iterator-blocks-and-parameter-checking.aspx –

+0

Chính xác. Vâng, tôi hiểu tại sao nó lại xảy ra. Chỉ cần không phải là cách đề nghị để đối phó với nó là :) – Svish

Các vấn đề liên quan