比较两个 DataTable(单元测试,集成测试,C#,TestMethod)

7

在单元测试中,当比较应该不同且有多行的Datatables时,应进行哪些测试。

    [TestMethod]
    public void ExecuteOutWithMultipleDataTables()
    {
        //Arrange
        int id1 = TestOrderBuilder.New().Build();
        DataTable dtDefault = CreateDefaultDataTable(id1, "OUT", "TableDesc", DateTime.Now);

        //Act
        object[] result = OracleDatabase.ExecuteOut(SqlStatements.Cursor, procedureParameters);
        DataTable dtResults = result[0] as DataTable;

        //Assert
        Assert.IsNotNull(dtDefault);
        Assert.IsNotNull(dtResults);
        Assert.AreNotEqual(dtDefault, dtResults);
        Assert.AreNotSame(dtDefault.Rows[0][0], dtResults.Rows[0][0]);
        Assert.AreNotSame(dtDefault.Rows[0][1], dtResults.Rows[0][1]);
    }

这是我已经写的内容的一部分示例,但我不确定我是否走在正确的轨道上。

有人有建议吗?

Mac


这是一个单元测试吗?我有所怀疑,看起来更像是集成测试。 - TalentTuner
抱歉,是的,我认为这在一定程度上是集成测试。dtDefault只是一个虚构的默认Datatable,不重要,但dtResults是从数据库中提取的(但也具有基本默认值,不太重要)。 - Mac
2个回答

11
如果您需要验证每行和每列的值,则需要编写帮助方法。此外,这似乎不像单元测试,因为它看起来是在调用真实的数据库而不是模拟它。可能类似以下内容:
private bool IsTableSame(DataTable t1, DataTable t2)
    {
        if (t1 == null)
            return false;
        if (t2 == null)
            return false;
        if (t1.Rows.Count != t2.Rows.Count)
            return false;

        if (t1.Columns.Count != t2.Columns.Count)
            return false;

        if (t1.Columns.Cast<DataColumn>().Any(dc => !t2.Columns.Contains(dc.ColumnName)))
        {
            return false;
        }

        for (int i = 0; i <= t1.Rows.Count-1; i++)
        {
            if (t1.Columns.Cast<DataColumn>().Any(dc1 => t1.Rows[i][dc1.ColumnName].ToString() != t2.Rows[i][dc1.ColumnName].ToString()))
            {
                return false;
            } 
        }

        return true;
    }

你如何编写一个帮助方法? 是集成测试,不是单元测试。 - Mac
看起来很棒,但是这行代码是做什么用的呢? if (t1.Columns.Cast<DataColumn>().Any(dc => !t2.Columns.Contains(dc.ColumnName)))DC是什么? - Mac
谢谢你分享这个。另外,我建议在方法内使用断言(asserts),当它们失败时提供有意义的消息。这将使故障单元测试更容易排除。 - Ryan Gates

5
我已经封装了同样的辅助方法来使用断言。它有助于调试单元测试。
private void AssertTableRecordsAreEqual(DataTable expectedTable, DataTable actualTable)
    {
        Assert.IsNotNull(actualTable, "Table is empty");
        Assert.AreEqual(expectedTable.Columns.Count, actualTable.Columns.Count, "Number of columns in actual and expected tables are different");
        Assert.AreEqual(expectedTable.Rows.Count, actualTable.Rows.Count, "Number of records in actual and expected tables are different");
        Assert.IsFalse(expectedTable.Columns.Cast<DataColumn>().Any(dc => !actualTable.Columns.Contains(dc.ColumnName)), "Table column names are different");

        for (int i = 0; i <= expectedTable.Rows.Count - 1; i++)
        {
            Assert.IsFalse(expectedTable.Columns.Cast<DataColumn>().Any(dc1 => expectedTable.Rows[i][dc1.ColumnName].ToString() != actualTable.Rows[i][dc1.ColumnName].ToString()), "Table row value is different");
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接