Почему Moles не возвращает "moled" DataSet при издевательстве над SqlDataAdaptor? - PullRequest
1 голос
/ 19 мая 2011

Я только начал использовать Кроты, чтобы издеваться над хитрым унаследованным кодом.По сути, я пытаюсь заставить 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");
    }
}

1 Ответ

0 голосов
/ 28 сентября 2011

По-новому взглянув на этот вопрос через несколько месяцев в соответствии с предложением @StingyJack насмешить метод Fill, я придумал следующее, чтобы поддержать мои требования к насмешкам. Это все еще не отвечает, почему набор данных не был заменен моим набором данных.

    [TestMethod]
    [HostType("Moles")]
    public void IsolatedSqlDataAdaptorTestWithFill()
    {
        // Arrange
        MSqlConnection.AllInstances.Open = c => { };
        MSqlConnection.AllInstances.Close = c => { };
        MSqlDataAdapter.ConstructorStringSqlConnection = (@this, cmd, conn) => { };
        MDbDataAdapter.AllInstances.FillDataSetString = (da, ds, s) =>
            {
                var dt = new DataTable(s);
                dt.Columns.Add(new DataColumn("string", typeof(string)));
                dt.Columns.Add(new DataColumn("int", typeof(int)));
                dt.Rows.Add("field", 5);
                ds.Tables.Add(dt);
                return 1;
            };

        // Act
        using (var dset = new DataSet())
        {
            using (var conn = new SqlConnection())
            {
                using (var da = new SqlDataAdapter("select something from aTable", conn))
                {
                    da.Fill(dset, "aTable");
                }
            }

            // Assert
            Assert.AreEqual(1, dset.Tables[0].Rows.Count, "Count");
            Assert.AreEqual("field", dset.Tables[0].Rows[0]["string"], "string");
            Assert.AreEqual(5, dset.Tables[0].Rows[0]["int"], "int");
        }
    }
...