在检查DataTable类型时使用Assert.AreEqual方法

时间:2013-08-21 19:23:07

标签: c# assert

我已经完成了线程,但无法在c#中找到传递案例的实现(msdn网站也没有数据表/泛型集合断言用法)..

客户端没有我们的代码(只有2个数据表返回给我们)

datarow dr1 = datatable1.newrow();
dr1[0] = 345;

datarow dr2 = datatable1.newrow()
dr2[0] = 345;

datatable1.rows.add(dr1); //(1)
datatable2.rows.add(dr2); //(2)
最后的代码

Assert.AreEqual(dt1,dt2); //fails!!How to pass this case??

3 个答案:

答案 0 :(得分:3)

Assert.AreEqual将在该类型上使用Equals方法。 DataTable不会覆盖此方法,因此这是一个参考检查。这意味着dt1不等于dt2

您可以使用CollectionAssert,但这会对成员进行比较。同样,DataRow不会覆盖Equals,因此会进行参考检查。

您需要编写自定义比较逻辑,然后执行Assert.IsTrue(DataTableComparer.AreEqual(dt1, dt2));

之类的操作

答案 1 :(得分:1)

您的AreEqual方法版本正在使用Assert.AreEqual(Object expected, Object actual)。这意味着它将使用Object.Equals()进行比较。

运行此代码并查看其值:

bool areEqual = dr1.Equals(dr2);

这将返回false,因为它们不是同一个引用。查看Object.Equals的文档:

  

如果当前实例是引用类型,则Equals(Object)方法测试引用相等性,并且对Equals(Object)方法的调用等效于对ReferenceEquals方法的调用。引用相等意味着比较的对象变量引用同一个对象。

您需要找到更合适的方式来比较您的数据。您可以使用DataRowComparer来比较值。您还可以循环遍历每一行并自己比较这些值。有关示例,请参阅dotnetperls

答案 2 :(得分:0)

除非对象覆盖“等于”方法

,否则AreEqual按引用进行比较

尝试以下内容,粘贴自http://social.msdn.microsoft.com/Forums/vstudio/en-US/23703a85-20c7-4759-806a-fabf4e9f5be6/how-to-compare-two-datatables

Assert.IsTrue(ComareDataTables(DTable1,DTable2));

private bool CompareDataTables(DataTable DT1, DataTable DT2)
    {
        if ((DT1 == null) && (DT2 == null))
            return true;
        else if ((DT1 != null) && (DT2 != null))
        {
            if (DT1.Rows.Count == DT2.Rows.Count)
            {
                if (DT1.Columns.Count == DT2.Columns.Count)
                {
                    for (int i = 0; i < DT1.Rows.Count; i++)
                    {
                        for(int j = 0; j<DT1.Columns.Count; j++)
                        {
                            if (DT1.Rows[i][j].ToString() != DT2.Rows[i][j].ToString())
                                return false;
                        }
                    }
                    return true;
                }
                else
                    return false;
            }
            else
                return false;
        }
        else
            return false;
    }