2010-05-07 110 views
3

從MbUnit的我想檢查兩個對象的值是使用比較兩個對象是在MbUnit的

Assert.AreSame(RawDataRow, result); 

但是我收到以下同一樣失敗:

Expected Value & Actual Value : {RawDataRow: CentreID = "CentreID1", 
CentreLearnerRef = "CentreLearnerRef1", 
ContactID = 1, DOB = 2010-05-05T00:00:00.0000000, 
Email = "Email1", ErrorCodes = "ErrorCodes1", 
ErrorDescription = "ErrorDescription1", FirstName = "FirstName1"} 

備註:兩個值在格式化時看起來相同,但它們是不同的實例。

我不想不得不通過每個屬性。我可以從MbUnit這樣做嗎?

回答

0

我已經結束了建築用我自己的思考

private bool PropertiesEqual<T>(T object1, T object2) 
     { 
      PropertyDescriptorCollection object2Properties = TypeDescriptor.GetProperties(object1); 
      foreach (PropertyDescriptor object1Property in TypeDescriptor.GetProperties(object2)) 
      { 
       PropertyDescriptor object2Property = object2Properties.Find(object1Property.Name, true); 

       if (object2Property != null) 
       { 
        object object1Value = object1Property.GetValue(object1); 
        object object2Value = object2Property.GetValue(object2); 

        if ((object1Value == null && object2Value != null) || (object1Value != null && object2Value == null)) 
        { 
         return false; 
        } 

        if (object1Value != null && object2Value != null) 
        { 
         if (!object1Value.Equals(object2Value)) 
         { 
          return false; 
         } 
        } 
       } 
      } 
      return true; 
     } 
+0

它會正常工作。但MbUnit已經有一個內置的結構相等比較器(請參閱我的答案)。 – 2010-05-12 06:43:49

0

你是專門尋找參考平等AreSame正在測試兩個引用指向同一個對象。從DOCO:

Assert.AreSame - 驗證的實際值是指涉相同的一些期望值。

如果您只是想比較一個對象的兩個實例在邏輯上相等,那麼AreEqual就是您所需要的。

Assert.AreEqual - 驗證實際值等於某個預期值。

+0

這就是我想,但我得到了相同的結果對於這個太 – Coppermill 2010-05-10 11:39:57

+0

僅供參考: 使用Assert.AreEqual或Assert.AreSame返回「備註:格式化的,但它們是不同的情況下,在雙方的值看起來是一樣的。 「 – Coppermill 2010-05-12 11:56:21

2

基本上,Assert.AreEqual使用Object.Equals()來驗證實際的和預期的實例之間的平等,而Assert.AreSame使用Object.ReferenceEquals

如果你的類沒有實現任何內置的平等機制;例如通過覆蓋Object.Equals,您將最終遇到所描述的問題,因爲MbUnit不知道如何比較兩個待測試類型的實例。

有幾種解決方案。其中之一是Coppermill的解決方案:您可能希望基於反射來實現結構相等比較器。但MbUnit已經有一個內置的feature like that。它被稱爲StructuralEqualityComparer<T>,它使用起來非常簡單。那麼爲什麼重新發明輪子?

Assert.AreSame(RawDataRow, result, new StructuralEqualityComparer<MyDataRow> 
{ 
    { x => x.CentreID }, 
    { x => x.CentreLearnerRef, (a, b) => a.Equals(b, StringComparison.OrdinalIgnoreCase) }, 
    { x => x.ContactID }, 
    // You can customize completely the comparison process... 
}); 

無論如何,我建議你閱讀這篇文章:http://interfacingreality.blogspot.com/2009/09/equality-assertions-in-mbunit-v3.html

您可能還需要在公堂維基閱讀that article

+1

我喜歡這個功能。 :) – 2010-05-15 09:10:13

0

在MbUnit的3你可以使用StructuralEqualityComparer:

Assert.AreElementsEqual(OBJ1,OBJ2,新StructuralEqualityComparer());