c# – 模拟一个DataReader并获取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期#0,实际#1

前端之家收集整理的这篇文章主要介绍了c# – 模拟一个DataReader并获取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期#0,实际#1前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图模拟一个sqlDataReader
  1. sqlDataReader reader = mocks.CreateMock<sqlDataReader>();
  2. Expect.Call(reader.Read()).Return(true).Repeat.Times(1);
  3. Expect.Call(reader.Read()).Return(false);
  4. Expect.Call(reader.HasRows).Return(true);
  5. Expect.Call(reader.Dispose);
  6. Expect.Call(reader["City"]).Return("Boise");
  7. Expect.Call(reader["State"]).Return("State");
  8. Expect.Call(reader["LAT"]).Return(100);
  9. Expect.Call(reader["LON"]).Return(-100);
  10. mocks.ReplayAll();

但我不断得到一个Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期#0,我的方法中的实际#1错误

  1. using (reader)
  2. {
  3. if (reader.HasRows)
  4. {
  5. while (reader.Read())
  6. {
  7. CityState myCity = new CityState
  8. {
  9. City = reader["City"].ToString(),State = reader["State"].ToString(),Lat = Convert.ToInt32(reader["LAT"]),Lon = Convert.ToInt32(reader["LON"])
  10. };
  11. myCities.Add(myCity);
  12. }
  13. }
  14. }

我错过了什么吗?

解决方法

我将建议您使用AAA语法和使用接口(IDataReader)而不是具体类型(sqlDataReader)重写测试:
  1. // Arrange
  2. IDataReader reader = MockRepository.GenerateStub<IDataReader>();
  3. reader.Stub(x => x.Read()).Repeat.Once().Return(true);
  4. reader.Stub(x => x.Read()).Return(false);
  5. reader.Stub(x => x["City"]).Return("Boise");
  6. reader.Stub(x => x["State"]).Return("State");
  7. reader.Stub(x => x["LAT"]).Return(100);
  8. reader.Stub(x => x["LON"]).Return(-100);
  9.  
  10. // Act
  11. var myCities = new List<CityState>();
  12. using (reader)
  13. {
  14. while (reader.Read())
  15. {
  16. CityState myCity = new CityState
  17. {
  18. City = reader["City"].ToString(),Lon = Convert.ToInt32(reader["LON"])
  19. };
  20. myCities.Add(myCity);
  21. }
  22. }
  23.  
  24. // Assert
  25. Assert.AreEqual(1,myCities.Count);
  26. Assert.AreEqual("Boise",myCities[0].City);
  27. ...

猜你在找的C#相关文章