У меня есть метод, которому в качестве параметра требуется объект 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)
FieldCount
дважды (даже в том же методе), вы получите два разных результата: 1 и затем 0? - person Patrick   schedule 09.10.2012FieldCount
ключевым словомnew
? - person Patrick   schedule 09.10.2012SqlDataReader
не имеет никаких явных или неявных операторов преобразования. - person casperOne   schedule 09.10.2012((IDataReader)mockedObject).FieldCount
? - person Patrick   schedule 09.10.2012method
, основываясь на том, что у вас есть в вашем вопросе прямо сейчас, я не вижу в этом ничего плохого. - person Patrick   schedule 09.10.2012