Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟数据读取器并获取Rhino.Mocks.Exceptions.ExpectationViolationException:IDisposable.Dispose();预期为0,实际为1_C#_Rhino Mocks - Fatal编程技术网

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

C# 模拟数据读取器并获取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

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