2011-11-26 14 views
7

Sıfır parametresi olarak geçirildiğinde bir özel durumun atıldığını test etmek istediğim bir sınamada garip bir davranışım var. Ben testi zaman NUnit aldığım:NUnit, ExpectedException ve getiri dönüşü ile garip davranış

System.ArgumentNullException was expected 
    -- Exception doesn't have a stack trace -- 

Benim testi:

[Test] 
[ExpectedException(typeof(ArgumentNullException))] 
public void Should_not_retrieve_any_fields_when_file_is_null() 
{ 
    _creator.CreateFields(null); 
} 

My uygulaması:

public IEnumerable<ImportField> CreateFields(HttpPostedFileBase file) 
{ 
    if (file == null) throw new ArgumentNullException("file"); 

    using (var reader = new StreamReader(file.InputStream)) 
    { 
     var firstLine = reader.ReadLine(); 
     var columns = firstLine.Split(new[] { ',' }); 

     for (var i = 0; i < columns.Length; i++) 
     { 
      yield return new ImportField(columns[i], i); 
     } 
    } 
} 

bu davranışa mantıklı bir açıklaması var mıdır ve ben yapmalıdır benim uygulama farklı mı?

cevap

7

Bu davranışa sahip olmanızın nedeni, elde edilen anahtar kelimedir. Verim kullanıldığında, derleyici, içindeki verim ile bir yöntem için bir sınıf üretecektir. Bu yöntemi çağırırken, kontrol koşulsuz olarak arayana geri döner. Metodunuzdaki hiçbir şey gerçekten ihtiyaç olmadan yürütülür.

Kullanım ifadenizi ayrı bir yöntemle çıkarır ve sonucu döndürürseniz, testiniz geçer. Ya da sonucu testinizdeki bir değişkene kaydedebilir ve örneğin üzerinde "ToList()" diyebilirsiniz.

public IEnumerable<ImportField> CreateFields(HttpPostedFileBase file) 
    { 
     if (file == null) throw new ArgumentNullException("file"); 

     return ExtractFromFile(file); 
    } 

    private IEnumerable<ImportField> ExtractFromFile(HttpPostedFileBase file) 
    { 
     using (var reader = new StreamReader(file.InputStream)) 
     { 
      var firstLine = reader.ReadLine(); 
      var columns = firstLine.Split(new[] { ',' }); 

      for (var i = 0; i < columns.Length; i++) 
      { 
       yield return new ImportField(columns[i], i); 
      } 
     } 
    } 
+0

+1 güzel yakalamak !! – sll

İlgili konular