2009-11-24 11 views
11

Bir SqlDataReaderDataReader'ı birleştirme ve bir Rhino.Mocks.Exceptions.ExpectationViolationException alma: IDisposable.Dispose(); Beklenen # 0, Gerçek 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(); 

alay çalışıyorum ama Rhino.Mocks.Exceptions.ExpectationViolationException almaya devam: IDisposable.Dispose(); Beklenen # 0, Benim yöntemimde Gerçek # 1 hatası

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

Bir şey mi eksik?

cevap

10

yerine beton türü (SqlDataReader) AAA sözdizimini kullanarak ve bir arabirim (IDataReader) kullanarak size testin yeniden yazmak önerir:

// 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

Bu yanıt kabul edilmiş olduğu için, çözülmesi gerekir varsayalım sorun. Ama soru şu: Neden işe yaradı? IDisposable ile aynı sorunu yaşıyorum (System.IO.Stream ile alay etmeye çalışıyorum) ve neden benim Stubbed Dispose() neden çağrılmadığını anlayamıyorum. –

+2

Çalışıyor 'SqlDataReader' ile 'IDataReader' değiştirildi ve bu 'IDataReader' alay çünkü. Durumunuzda, bir arayüz yerine soyut bir sınıfla çalışıyorsunuz gibi görünüyor. Bu durumda, mockRepository.GeneratePartialMock () 'ile alay konusu nesneyi oluşturmanız ve' streamMock.Expect (x => x.Dispose()) kullanarak beklentileri tanımlamanız gerekir. At (yeni İstisna ("foo")) ; '. –

+0

CityState için bir uygulama ekledikten sonra bu örnek makinenizde çalışıyor mu? Aksi takdirde, tam kodu sağlayabiliyor mu? Hatta var okuyucu = new Mock () ve reader.Setup (...) kullandıktan sonra bile 4.0.10827 ile benim için değil. – Lernkurve

İlgili konular