我有一个方法,需要一个SqlDataReader对象作为参数,我有测试,我已经模拟了该对象,一切正常。
但是,现在我需要改变那种方法。它现在应该只调用新方法,它有一个IDataReader作为参数,这就是一个问题,因为,当我将模拟的SqlDataReader作为新方法的参数传输时,它正在丢失他的数据,我不知道为什么。
这样的事情:
void method(SqlDataReader mockedObject)
{
// example property
mockedObject.FieldCount; // for example the value is 1;
newMethod(mockedObject);
}
void newMethod(IDataReader newObject)
{
// example property
newObject.FieldCount // here value is 0;
}
我观察到如果我只是将SqlDataReader对象复制到IDataReader类型的新变量,那么数据也会被清除。
这样的事情:
void method(SqlDataReader mockedObject)
{
IDataReader variable = mockedObject;
}
正确的代码:
=========================================================================================
[TestMethod()]
[DeploymentItem("IICMS.dll")]
public void CheckNullableDateTimeTest_SqlDataReader_Valid()
{
MockRepository mocks = new MockRepository();
SqlDataReader reader = mocks.DynamicMock<SqlDataReader>();
string column = "test";
DateTime? expected = new DateTime(2, 1, 1);
Nullable<DateTime> actual;
reader.Stub(r => r[column]).Return(expected);
reader.Stub(r => r.FieldCount).Return(1);
mocks.ReplayAll();
actual = Utility_Accessor.CheckNullableDateTime(reader, column);
Assert.AreEqual(expected, actual);
}
======================================================================================
public static DateTime? CheckNullableDateTime(SqlDataReader read, string column)
{
return GetValue<DateTime?>(read, column, null);
}
======================================================================================
public static T GetValue<T>(IDataReader reader, string columnName, T defaultValue)
{
try
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (reader.GetName(i) == columnName)
{
object value = reader[i];
return Convert.IsDBNull(value) ? defaultValue : (T)value;
}
}
return defaultValue;
}
catch
{
return defaultValue;
}
}
所以有代码,第二种和第三种方法都在其他dll中,但它对任何事物都没有影响。对象在RhinoMocks中被模拟;)
将SqlDataReader对象(读取)传输到GetValue方法后数据丢失(即FieldCount等于0,在Check ..方法中它具有正确的值= 1)
答案 0 :(得分:0)
我无法解释这一点,但改变测试方法到下面的表格,那就是 所有对象字段在每个方法中都是可用的(CheckNullString和GetValue):
[TestMethod()]
[DeploymentItem("IICMS.dll")]
public void CheckNullableDateTimeTest_SqlDataReader_Valid()
{
MockRepository mocks = new MockRepository();
SqlDataReader reader = mocks.DynamicMock<SqlDataReader>();
IDataReader reader2 = reader;
string column = "test";
DateTime? expected = new DateTime(2,1,1);
DateTime? actual;
reader.Stub(r => r[column]).Return(invalidValue);
reader.Stub(r => r[0]).Return(invalidValue);
reader.Stub(r => r.FieldCount).Return(1);
reader.Stub(r => r.GetName(0)).Return(column);
reader2.Stub(r => r[column]).Return(invalidValue);
reader2.Stub(r => r[0]).Return(invalidValue);
reader2.Stub(r => r.FieldCount).Return(1);
reader2.Stub(r => r.GetName(0)).Return(column);
mocks.ReplayAll();
actual = Utility_Accessor.CheckNullString(reader, column);
Assert.AreEqual(expected, actual);
}