2009-11-24 26 views
11

Tôi đang cố gắng để thử một SqlDataReaderMocking một DataReader và nhận được một Rhino.Mocks.Exceptions.ExpectationViolationException: IDisposable.Dispose(); Dự kiến ​​# 0, thực tế # 1

SqlDataReader reader = mocks.CreateMock<SqlDataReader>(); 
Expect.Call(reader.Read()).Return(true).Repeat.Times(1); 
Expect.Call(reader.Read()).Return(false); 
Expect.Call(reader.HasRows).Return(true); 
Expect.Call(reader.Dispose); 
Expect.Call(reader["City"]).Return("Boise"); 
Expect.Call(reader["State"]).Return("State"); 
Expect.Call(reader["LAT"]).Return(100); 
Expect.Call(reader["LON"]).Return(-100); 
mocks.ReplayAll(); 

nhưng tôi tiếp tục nhận được một Rhino.Mocks.Exceptions.ExpectationViolationException: IDisposable.Dispose(); Dự kiến ​​# 0, Lỗi # 1 thực tế trong phương pháp của tôi

 using (reader) 
     { 
      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        CityState myCity = new CityState 
         { 
          City = reader["City"].ToString(), 
          State = reader["State"].ToString(), 
          Lat = Convert.ToInt32(reader["LAT"]), 
          Lon = Convert.ToInt32(reader["LON"]) 
         }; 
        myCities.Add(myCity); 
       }      
      }    
     } 

Tôi có thiếu gì đó không?

Trả lời

10

tôi sẽ đề nghị bạn viết lại của bài kiểm tra sử dụng cú pháp AAA và sử dụng một giao diện (IDataReader) thay vì loại bê tông (SqlDataReader):

// Arrange 
IDataReader reader = MockRepository.GenerateStub<IDataReader>(); 
reader.Stub(x => x.Read()).Repeat.Once().Return(true); 
reader.Stub(x => x.Read()).Return(false); 
reader.Stub(x => x["City"]).Return("Boise"); 
reader.Stub(x => x["State"]).Return("State"); 
reader.Stub(x => x["LAT"]).Return(100); 
reader.Stub(x => x["LON"]).Return(-100); 

// Act 
var myCities = new List<CityState>(); 
using (reader) 
{ 
    while (reader.Read()) 
    { 
     CityState myCity = new CityState 
     { 
      City = reader["City"].ToString(), 
      State = reader["State"].ToString(), 
      Lat = Convert.ToInt32(reader["LAT"]), 
      Lon = Convert.ToInt32(reader["LON"]) 
     }; 
     myCities.Add(myCity); 
    } 
} 

// Assert 
Assert.AreEqual(1, myCities.Count); 
Assert.AreEqual("Boise", myCities[0].City); 
... 
+0

tôi cho rằng kể từ khi câu trả lời này đã được chấp nhận, nó phải giải quyết vấn đề. Nhưng câu hỏi vẫn là: Tại sao nó hoạt động? Tôi có cùng một vấn đề với IDisposable (Tôi đang cố gắng để giả lập System.IO.Stream), và tôi không thể tìm ra lý do tại sao tôi vứt bỏ() không được gọi. –

+2

Nó hoạt động vì chúng tôi đã thay thế 'SqlDataReader' bằng' IDataReader' và giả lập 'IDataReader' này. Trong trường hợp của bạn có vẻ như bạn đang làm việc với một lớp trừu tượng thay vì một giao diện. Trong trường hợp này, bạn cần phải tạo đối tượng giả lập với 'MockRepository.GeneratePartialMock ()' và xác định các kỳ vọng về nó bằng cách sử dụng 'streamMock.Expect (x => x.Dispose()). Throw (new Exception (" foo ")) ; '. –

+0

Ví dụ này có chạy trên máy của bạn sau khi bạn thêm triển khai cho CityState không? Nếu không, bạn có thể cung cấp mã đầy đủ để nó chạy không? Nó không cho tôi với Moq 4.0.10827 ngay cả sau khi sử dụng var reader = new Mock () và reader.Setup (...). – Lernkurve

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