2013-03-05 105 views
2

比较应该不同并且具有多行的数据表时,应该在单元测试中执行什么类型的测试。比较两个DataTable(单元测试,集成测试,C#,TestMethod)

[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

+0

它是单元测试吗?我怀疑,看起来像集成测试 – TalentTuner 2013-03-05 10:29:15

+0

对不起,是的,我认为这是集成测试在一定程度上。 dtDefault只是一个组成的默认数据表,这并不重要,但dtResults从数据库中提取(但也是基本的默认值,无关紧要)。 – Mac 2013-03-05 10:32:13

回答

7

你需要写一个辅助方法,如果你需要验证每行和每列的值。

此外,它看起来不像单元测试,因为它看起来是在调用真正的数据库而不是嘲笑它。

可能类似于以下

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; 
    } 
+0

你如何编写一个辅助方法? 是的,它是集成测试,而不是单元测试。 – Mac 2013-03-05 10:35:45

+0

看起来很棒,但是这条线是做什么的? if(t1.Columns.Cast ().Any(dc =>!t2.Columns.Contains(dc.ColumnName))) 什么是DC? – Mac 2013-03-05 10:55:31

+0

谢谢你分享这个。另外,我建议在方法中使用断言,当失败时提供有意义的消息。这样可以更轻松地排除故障单元测试的故障。 – 2014-11-06 16:01:05

0

我已包裹上述相同的辅助方法使用断言。它有助于调试单元测试。

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