C# 比较MbUnit中相同的两个对象

C# 比较MbUnit中相同的两个对象,c#,unit-testing,equality,mbunit,gallio,C#,Unit Testing,Equality,Mbunit,Gallio,在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", Error

在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执行此操作吗?

您是否专门寻找引用平等
AreName
正在测试两个引用是否指向同一个对象。从文件:

-验证实际值是否与某个预期值参考相同

如果您只是想比较一个对象的两个实例在逻辑上是否相等,那么
AreEqual
就是您所需要的

-验证实际值是否等于某个预期值


我最终用反射建立了自己的模型

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;
        }
private bool PropertiesEqual(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)
{
object1Value=object1Property.GetValue(object1);
object2Value=object2Property.GetValue(object2);
if((object1Value==null&&object2Value!=null)| |(object1Value!=null&&object2Value==null))
{
返回false;
}
if(object1Value!=null&&object2Value!=null)
{
如果(!object1Value.Equals(object2Value))
{
返回false;
}
}
}
}
返回true;
}

基本上,
Assert.AreEqual
使用
Object.Equals()
验证实际实例和预期实例之间的相等性,而
Assert.areName
使用
Object.ReferenceEquals

如果您的类没有实现任何内置的平等机制;例如,通过重写
Object.Equals
,您将得到您描述的问题,因为您不知道如何比较被测类型的两个实例

有几种解决方案。其中之一是Coppermill的解决方案:您可能希望实现一个基于反射的结构等式比较器。但是MbUnit已经有了一个内置的。它被称为
StructuralEqualityComparer
,非常容易使用。那么为什么要重新发明轮子呢

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...
});
Assert.arame(RawDataRow,result,新结构的equalitycomparer
{
{x=>x.CentreID},
{x=>x.CentreLearnerRef,(a,b)=>a.Equals(b,StringComparison.OrdinalIgnoreCase)},
{x=>x.ContactID},
//您可以完全自定义比较过程。。。
});
无论如何,我建议你读那篇文章:


您可能还想在Gallio wiki中阅读。

在MbUnit 3中,您可以使用StructuralEqualityComparer:


arElementSequal(obj1,obj2,新的StructuralEqualityComparer())

这就是我的想法,但我得到的结果与此相同,仅供参考:使用Assert.AreEqual或Assert.AreName返回“备注:两个值在格式化时看起来相同,但它们是不同的实例。”这将很好地工作。但是MbUnit已经有了一个内置的结构相等比较器(参见我的答案)。