2011-11-26 38 views
7

Tôi có một hành vi lạ trong một thử nghiệm mà tôi muốn kiểm tra rằng một ngoại lệ được ném khi null được truyền vào như một tham số. Khi tôi chạy thử nghiệm tôi nhận được từ NUnit:Hành vi lạ với NUnit, ExpectedException & return return

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

thử nghiệm của tôi:

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

thực hiện của tôi:

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); 
     } 
    } 
} 

Có một lời giải thích hợp lý để hành vi này và tôi nên làm của tôi thực hiện khác nhau?

Trả lời

7

Lý do bạn nhận được hành vi này là do từ khóa lợi nhuận. Khi sử dụng năng suất, trình biên dịch sẽ tạo ra một lớp cho phương thức với năng suất trong nó. Khi gọi phương thức đó, điều khiển được trả về vô điều kiện để quay lại người gọi. Không có gì trong phương pháp của bạn thực sự được thực hiện trước khi nó là cần thiết.

Nếu bạn trích xuất câu lệnh sử dụng của mình thành một phương thức riêng và trả về kết quả, bài kiểm tra của bạn sẽ vượt qua. Hoặc bạn có thể lưu kết quả vào một biến trong thử nghiệm của bạn, và ví dụ gọi là "ToList()" trên đó.

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 đẹp bắt !! – sll