2010-05-07 85 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());