2009-11-24 6 views
11

Sto cercando di prendere in giro uno SqlDataReaderMocking di un DataReader e acquisizione di Rhino.Mocks.Exceptions.ExpectationViolationException: IDisposable.Dispose(); Previsto # 0, # 1 Actual

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

ma io continuo a ricevere un Rhino.Mocks.Exceptions.ExpectationViolationException: IDisposable.Dispose(); Atteso n. 0, errore effettivo n. 1 nel mio metodo

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

Mi manca qualcosa?

risposta

10

Io suggerisco una riscrittura del test usando la sintassi AAA e l'utilizzo di un'interfaccia (IDataReader) invece di tipo concreto (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

presumo che da quando questa risposta è stata accettata, deve essere risolto il problema. Ma la domanda rimane: perché ha funzionato? Ho lo stesso problema con IDisposable (sto cercando di deridere System.IO.Stream), e non riesco a capire perché il mio Dispose() non viene chiamato. –

+2

Funziona perché abbiamo sostituito 'SqlDataReader' con' IDataReader' e preso in giro questo 'IDataReader'. Nel tuo caso sembra che tu stia lavorando con una classe astratta invece di un'interfaccia. In questo caso è necessario creare l'oggetto mocked con 'MockRepository.GeneratePartialMock ()' e definito le aspettative su di esso usando 'streamMock.Expect (x => x.Dispose()). Throw (new Exception (" foo ")) ; '. –

+0

Esegue questo esempio sul computer dopo aver aggiunto un'implementazione per CityState? In caso contrario, potresti fornire il codice completo in modo che venga eseguito? Non fa per me con Moq 4.0.10827 anche dopo aver usato var reader = new Mock () e reader.Setup (...). – Lernkurve

Problemi correlati