2011-06-08 26 views
9

Tôi đã mã kiểm tra sau:Rhino Mocks Lỗi: Phương pháp trước 'IEnumerator.MoveNext();' đòi hỏi một giá trị trả về hoặc một ngoại lệ để ném

parentViewModel = MockRepository.GenerateMock<IParentViewModel>(); 
parentViewModel.Expect(x => x.GetPropertyValue<IEnumerable<Milestone>>("JobMilestones")).Return(new Milestone[0]); 

viewModel = new JobPenaltiesViewModel(j, new Penalty[0], _opContext, parentViewModel); 

Assert.That(viewModel.Milestones.Count(), Is.EqualTo(0)); 
parentViewModel.VerifyAllExpectations(); 

List<string> propsChanged = new List<string>(); 
viewModel.PropertyChanged += (s, e) => propsChanged.Add(e.PropertyName); 

parentViewModel.Raise(x => x.PropertyChanged += null, parentViewModel, new PropertyChangedEventArgs("JobMilestones")); 

AssertPropertiesChangedAsExepected(propsChanged, 1, "Milestones"); 

Milestone m1 = GenerateMilestone(j); 
List<Milestone> milestones1 = new List<Milestone> { m1 }; 
parentViewModel.Expect(x => x.GetPropertyValue<IEnumerable<Milestone>>("JobMilestones")).Return(milestones1).Repeat.Any(); 

IEnumerable<Milestone> milestones = viewModel.Milestones; 
Assert.That(milestones.Count(), Is.EqualTo(1)); 
parentViewModel.VerifyAllExpectations(); 

Tất cả các bài kiểm tra và khẳng định thành công cho đến khi:

Assert.That(milestones.Count(), Is.EqualTo(1)); 

Đó là nơi mà tôi nhận được ngoại lệ:

Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw. 

Tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến, và thử nghiệm của tôi dường như chỉ ra rằng parentViewModel Mock trả về null hoặc một em liệt kê pty (tức là khi tôi sử dụng trình gỡ lỗi để kiểm tra giá trị trả về, 'Chế độ xem kết quả' cho biết liệt kê không trả về kết quả nào).

tôi thiếu gì ở đây?

+1

Bạn có nhận được kết quả chính xác không nếu bạn cố gắng thực hiện: 'IEnumerable milestones = parentViewModel.Milestones;' và 'Assert.That (milestones.Count(), Is.EqualTo (1))'? (Chỉ cần xác minh nơi bạn mất m1) – steenhulthin

+1

Không, 'Assert.That (milestones.Count(), Is.EqualTo (1))' là nguồn gốc của ngoại lệ. Tôi không bao giờ nhận được 'parentViewModel.VerifyAllExpectations()' – CodingGorilla

+1

Ok, tôi không rõ ràng ý của tôi là gì. Tôi có nghĩa là thêm các dòng ngay sau 'parentViewModel.Expect (x => x.GetPropertyValue > (" JobMilestones ")). Return (milestones1) .Repeat.Bất kỳ(); 'để bạn khẳng định trên' parentViewModel' trước khi khẳng định trên 'viewModel'. Để xác minh rằng 'm1' nằm trong' parentViewModel.JobMileStones' (tôi đã viết parentViewModel.MileStones trong bình luận đầu tiên - bad của tôi.). – steenhulthin

Trả lời

0

Tôi đã kể từ khi loại bỏ các mã vi phạm; tuy nhiên tôi chưa bao giờ tìm ra lý do tại sao nó hoạt động theo cách của nó.

2

milestones.Count() được thực hiện như thế (vì đây là một đối tượng IEnumerable):

  1. Set ngược lại 0.
  2. Lấy phần tử đầu tiên.
  3. Thêm 1 vào bộ đếm.
  4. Di chuyển đến phần tử tiếp theo.
  5. Bước 3 cho đến phần tử tiếp theo là null
  6. Return quầy

Vì vậy, tôi đề nghị bạn nhận được một số viết lại.

Lựa chọn 1:

  1. Tạo không thu IEnumerable, nhưng một số đối tượng mạnh hơn, như List hoặc Array:

    var milestones = viewModel.Milestones.ToArray();
    //var milestones = viewModel.Milestones.ToList();

    Sau đó bạn có thể sử dụng tương ứng CountLength tài sản cho Assert kiểm tra:

    Assert.That(milestones.Count, Is.EqualTo(1));
    //Assert.That(milestones.Length, Is.EqualTo(1));

  2. Tạo một biến cục bộ để lưu trữ thông số đếm:

    var count = viewModel.Milestones.Count(); // .Count() method executes here. Assert.That(count, Is.EqualTo(1));

+1

Tôi hiểu những gì bạn đang nói, và nó có ý nghĩa gì đó. Nhưng câu hỏi tôi vẫn có là cuộc gọi đến 'parentViewModel' sẽ trả về một đối tượng' List <> 'thực sự (chú ý lệnh' Expect'). Vì vậy, các cuộc gọi đến 'Count()' thậm chí không cần phải liệt kê nó, nó nên gọi tính Count trong danh sách. Nó gần như là RhinoMocks đang viết lại giá trị trả về. – CodingGorilla

+1

@Coding Gorilla Tôi phải lưu ý rằng bạn đang gọi phương thức '.Count()' của 'IEnumerable ', không phải thuộc tính' Count' của 'List ', do đó điều này dẫn đến việc liệt kê 'IEnumerable ' . – VMAtm

+1

Điều đó không đúng, phương thức .Count() đủ thông minh để tìm ra xem loại underly có hỗ trợ thuộc tính Count hay không và sẽ sử dụng thuộc tính đó nếu nó có sẵn. Xem các chú thích ở đây: http://msdn.microsoft.com/en-us/library/bb535181.aspx – CodingGorilla

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