代码之家  ›  专栏  ›  技术社区  ›  Bob The Janitor

模拟数据读取器并获取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期0,实际1

  •  11
  • Bob The Janitor  · 技术社区  · 15 年前

    我在模仿一个sqldatareader

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

    我错过什么了吗?

    1 回复  |  直到 15 年前
        1
  •  10
  •   Darin Dimitrov    15 年前

    我建议您使用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);
    ...