2009-11-24 4 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の構文を使用してテストの書き換えを示唆し、代わりに、具体的なタイプ(SqlDataReader)のインターフェース(IDataReader)を使用します:

// 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()が呼び出されていないのか分かりません。 –

+2

これは、 'SqlDataReader'を' IDataReader'に置き換え、この 'IDataReader'を嘲笑したために動作します。あなたの場合は、インターフェイスの代わりに抽象クラスで作業しているようです。この場合、モックされたオブジェクトを 'MockRepository.GeneratePartialMock ()'で作成し、 'streamMock.Expect(x => x.Dispose())を使って期待値を定義する必要があります。 ; '。 –

+0

CityStateの実装を追加した後、この例はあなたのマシンで実行されますか?そうでない場合は、実行するように完全なコードを提供できますか? var reader = new Mock ()とreader.Setup(...)を使った後でさえ、Moq 4.0.10827で私にとってはそうではありません。 – Lernkurve

関連する問題