2009-11-24 34 views
11

我試圖嘲弄一個SqlDataReader模擬DataReader並獲取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();預計#0,實際#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(); 

,但我不斷收到一個Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();預期#0,我方法中的實際#1錯誤

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

我錯過了什麼?

回答

10

我會使用AAA的語法和使用接口(IDataReader),而不是具體類型(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

我認爲,因爲這個答案被接受,它必須解決問題。但問題依然存在:爲什麼它有效?我有與IDisposable相同的問題(我試圖嘲笑System.IO.Stream),我無法弄清楚爲什麼我的存根Dispose()沒有被調用。 – 2010-09-26 02:33:57

+2

它的工作原理是因爲我們用'IDataReader'替換了'SqlDataReader'並嘲笑了這個'IDataReader'。在你的情況下,似乎你正在使用抽象類而不是接口。在這種情況下,您需要使用'MockRepository.GeneratePartialMock ()'創建模擬對象,並使用'streamMock.Expect(x => x.Dispose())定義期望。拋出(new exception(「foo」)) ;'。 – 2010-09-26 09:17:05

+0

一旦爲CityState添加實現,此示例是否會在您的機器上運行?如果不是,你能提供完整的代碼嗎?即使在使用var reader = new Mock ()和reader.Setup(...)之後,它也不適合我使用Moq 4.0.10827。 – Lernkurve 2011-01-12 13:20:24

相關問題