2013-03-05 101 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"); 
     } 
    }