Я только начал использовать Кроты, чтобы издеваться над хитрым унаследованным кодом.По сути, я пытаюсь заставить SqlDataAdapter работать с Кротами.(Кстати, я успешно использовал родинки с классами SqlDataReader и SqlCommand.) Ниже я попытался создать «простой» пример модульного теста, где я пытаюсь заставить SqlDataAdaptor «заполнить» предоставленный DataSet.Затем, используя Moles, я высмеиваю различные вызовы при извлечении данных из набора данных.Я полагаю, что правильно настроил DataSet, чтобы при извлечении данных возвращался ожидаемый «moled» объект и все делалось правильно.
Когда я запускаю приведенное ниже, я вижу, что выполняется лямбда-выражение FillDataSetString и«d» устанавливается на «moled» ds.Но когда метод Fill возвращается, переданный в DataSet («dset») все еще является обычным «DataSet», а не «moled DataSet».Таким образом, первый Assert не работает правильно и генерирует исключение IndexOutOfRangeException («Не удается найти таблицу 0.»).В первом утверждении я ожидаю, что при вычислении dset.Tables [0] .Rows.Count будут вызваны следующие «moled» методы:
ds.TablesGet
tables.ItemGetInt32
table.RowsGet
rows.CountGet
Но так как dset не является «moled»"DataSet, ни один из этих вызовов не происходит.Любая помощь в выяснении того, что Moles делает с параметром набора данных SqlDataAdapter, будет высоко оценена.
Чтобы заставить работать нижеприведенное, вы должны установить «Moles», ссылаясь на System.Data, System.Xml, создать «Систему.Data.moles "ссылка.Я использую 0.94.0.0 платформы Moles и запускаю ее в VS.NET 2010, где для "Target Framework" тестового проекта установлено ".NET Framework 4.0".
using System.Data;
using System.Data.Moles;
using System.Data.Common.Moles;
using System.Data.SqlClient;
using System.Data.SqlClient.Moles;
using System.Xml.Serialization;
[TestClass]
public class UnitTest1
{
[TestMethod]
[HostType("Moles")]
public void IsolatedSqlDataAdaptorTest()
{
// Arrange
Dictionary<string, object> backing = new Dictionary<string, object>()
{
{"field", 5},
};
MSqlConnection.AllInstances.Open = (c) => { };
MSqlConnection.AllInstances.Close = (c) => { };
MSqlDataAdapter.ConstructorStringSqlConnection =
(@this, cmd, conn) =>
{
// Setup a moled DataSet with 1 Table and 1 Row
MDataRow row = new MDataRow()
{
// This is the method that ultimately gets called.
ItemGetString = (key) => { return backing[key]; },
};
MDataRowCollection rows = new MDataRowCollection();
rows.CountGet = () => { return 1; };
rows.ItemGetInt32 = (i) => { return row; };
MDataTable table = new MDataTable();
table.RowsGet = () => { return rows; };
MDataTableCollection tables = new MDataTableCollection();
tables.ItemGetInt32 = (i) => { return table; };
MDataSet ds = new MDataSet();
ds.TablesGet = () => { return tables; };
MSqlDataAdapter sdaMole = new MSqlDataAdapter(@this);
MDbDataAdapter ddaMole = new MDbDataAdapter(sdaMole)
{
FillDataSetString = (d, s) =>
{
d = ds;
return 1;
},
};
};
// Act
DataSet dset = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(
"select something from aTable",
new SqlConnection());
da.Fill(dset, "aTable");
// Assert
Assert.AreEqual(1, dset.Tables[0].Rows.Count, "Count");
Assert.AreEqual(5, dset.Tables[0].Rows[0]["field"], "field");
}
}