C# 模拟数据读取器并获取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期为0,实际为1
我正试图模仿SqlDataReaderC# 模拟数据读取器并获取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期为0,实际为1,c#,rhino-mocks,C#,Rhino Mocks,我正试图模仿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.D
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();
我错过什么了吗 我建议您使用AAA语法重写测试,并使用接口(
IDataReader
)而不是具体类型(SqlDataReader
):
//排列
IDataReader reader=MockRepository.GenerateSub();
reader.Stub(x=>x.Read()).Repeat.Once().Return(true);
reader.Stub(x=>x.Read()).Return(false);
reader.Stub(x=>x[“城市]).Return(“博伊西”);
reader.Stub(x=>x[“State”])。返回(“State”);
reader.Stub(x=>x[“LAT”])。Return(100);
reader.Stub(x=>x[“LON”])。返回(-100);
//表演
var myCities=新列表();
使用(读卡器)
{
while(reader.Read())
{
CityState myCity=新CityState
{
City=读卡器[“City”]。ToString(),
State=读卡器[“State”]。ToString(),
Lat=Convert.ToInt32(读卡器[“Lat”]),
Lon=Convert.ToInt32(读卡器[“Lon”])
};
myCities.Add(myCity);
}
}
//断言
Assert.AreEqual(1,myCities.Count);
Assert.AreEqual(“Boise”,myCities[0].City);
...
我想既然这个答案被接受了,它一定解决了问题。但问题依然存在:它为什么起作用?我对IDisposable也有同样的问题(我试图模拟System.IO.Stream),我不明白为什么我的stubbed Dispose()没有被调用。它可以工作,因为我们用IDataReader
替换了IDataReader
,并模拟了这个IDataReader
。在您的例子中,您似乎使用的是抽象类而不是接口。在这种情况下,您需要使用MockRepository.GeneratePartialMock()
创建模拟对象,并使用streamMock.Expect(x=>x.Dispose()).Throw(新异常(“foo”))对其定义期望代码>。添加CityState的实现后,此示例是否在您的计算机上运行?如果没有,你能提供完整的代码让它运行吗?即使在使用var reader=new Mock()和reader.Setup(…)之后,Moq 4.0.10827也不适用于我。
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);
}
}
}
// 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);
...