Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 为什么不是';t摩尔返回“;“莫雷德”;模拟SQLDataAdapter时的数据集?_C#_Unit Testing_Mocking_Moles_Sqldataadapter - Fatal编程技术网

C# 为什么不是';t摩尔返回“;“莫雷德”;模拟SQLDataAdapter时的数据集?

C# 为什么不是';t摩尔返回“;“莫雷德”;模拟SQLDataAdapter时的数据集?,c#,unit-testing,mocking,moles,sqldataadapter,C#,Unit Testing,Mocking,Moles,Sqldataadapter,我刚刚开始使用Moles来模拟一些棘手的遗留代码。本质上,我正在尝试使用SqlDataAdapter来处理Moles。(顺便说一句,我已经成功地将moles与SqlDataReader和SqlCommand类一起使用。)我尝试在下面创建一个“简单”的单元测试示例,其中我试图让SqlDataAdapter“填充”提供的数据集。然后,当使用Moles时,我模拟从数据集中检索数据的各种调用。我相信我已经正确地设置了数据集,以便检索数据将返回预期的“moled”对象并执行正确的操作 当我运行下面的代码时

我刚刚开始使用Moles来模拟一些棘手的遗留代码。本质上,我正在尝试使用SqlDataAdapter来处理Moles。(顺便说一句,我已经成功地将moles与SqlDataReader和SqlCommand类一起使用。)我尝试在下面创建一个“简单”的单元测试示例,其中我试图让SqlDataAdapter“填充”提供的数据集。然后,当使用Moles时,我模拟从数据集中检索数据的各种调用。我相信我已经正确地设置了数据集,以便检索数据将返回预期的“moled”对象并执行正确的操作

当我运行下面的代码时,我可以看到正在执行FillDataSetString lambda表达式,并且“d”被设置为“moled”ds。但是当Fill方法返回时,传入的数据集(“dset”)仍然是一个常规的“数据集”,而不是“moled数据集”。因此,第一个断言操作不正确,并抛出IndexOutOfRangeException(“找不到表0”)。在第一个断言中,我希望在计算dset.Tables[0].Rows.Count时调用以下“moled”方法:

    ds.TablesGet
    tables.ItemGetInt32
    table.RowsGet
    rows.CountGet
但由于dset不是“moled”数据集,因此这些调用都不会发生。如果您能帮助了解Moles如何处理SqlDataAdapter的dataset参数,我们将不胜感激

要使下面的内容正常工作,您必须安装“Moles”,引用System.Data,System.Xml,创建一个“System.Data.Moles”引用。我正在使用Moles框架的0.94.0.0,并在VS.NET2010中运行它,测试项目的“目标框架”设置为.NETFramework4.0

使用系统数据;
使用System.Data.Moles;
使用System.Data.Common.Moles;
使用System.Data.SqlClient;
使用System.Data.SqlClient.Moles;
使用System.Xml.Serialization;
[测试类]
公共类UnitTest1
{
[测试方法]
[主机类型(“鼹鼠”)]
公共void IsolatedSqlDataAdapterTest()
{
//安排
字典备份=新字典()
{
{“字段”,5},
};
MSqlConnection.AllInstances.Open=(c)=>{};
MSqlConnection.AllInstances.Close=(c)=>{};
MSqlDataAdapter.ConstructorStringSqlConnection=
(@this,cmd,conn)=>
{
//设置一个包含1个表和1行的moled数据集
MDataRow行=新的MDataRow()
{
//这是最终被调用的方法。
ItemGetString=(键)=>{return backing[key];},
};
MDataRowCollection行=新的MDataRowCollection();
rows.CountGet=()=>{return 1;};
rows.ItemGetInt32=(i)=>{return row;};
MDataTable=新的MDataTable();
table.RowsGet=()=>{返回行;};
MDataTableCollection tables=新的MDataTableCollection();
tables.ItemGetInt32=(i)=>{return table;};
MDataSet ds=新的MDataSet();
ds.tableGet=()=>{return tables;};
MSqlDataAdapter sdaMole=新的MSqlDataAdapter(@this);
MDbDataAdapter ddaMole=新的MDbDataAdapter(sdaMole)
{
FillDataSetString=(d,s)=>
{
d=ds;
返回1;
},
};
};
//表演
数据集dset=新数据集();
SqlDataAdapter da=新的SqlDataAdapter(
“从aTable中选择内容”,
新建SqlConnection());
数据填充(数据集,“表”);
//断言
Assert.AreEqual(1,dset.Tables[0].Rows.Count,“Count”);
Assert.AreEqual(5,dset.Tables[0]。行[0][“字段”],“字段”);
}
}

在@StingyJack提出模拟填充方法的建议几个月后,我重新审视了这个问题,我提出了以下建议来支持我的模拟要求。它仍然不能真正回答为什么数据集没有被替换为我的moled数据集

    [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");
        }
    }

您真的需要创建整个数据集吗?为什么不直接打电话呢?好建议。我把它改写成:我不确定我是否应该把上面的内容作为这个问题的答案。建议?等两天(我想这是时间限制),如果它解决了问题,就把它标记为答案。这样做的目的是确保其他人可以从你遇到的问题中学习,没有人会因为你把自己的问题作为答案而指责你。
    [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");
        }
    }