3

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

4

4 回答 4

2

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

如果你的类没有实现任何内置的平等机制;例如,通过覆盖Object.Equals,您最终会遇到您描述的问题,因为MbUnit不知道如何比较被测类型的两个实例。

有几种解决方案。其中之一是 Coppermill 的解决方案:您可能希望实现基于反射的结构相等比较器。但是 MbUnit 已经内置了类似的功能。它被称为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

您可能还想阅读Gallio wiki 中的那篇文章

于 2010-05-12T06:42:18.837 回答
0

您是否专门寻找参照平等AreSame正在测试两个引用是否指向同一个对象。从多科:

Assert.AreSame- 验证实际值是否与某个预期值在引用上相同。

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

Assert.AreEqual- 验证实际值是否等于某个预期值。

于 2010-05-07T13:35:23.813 回答
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;
        }
于 2010-05-10T11:41:02.983 回答
0

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

Assert.AreElementsEqual(obj1,obj2, new StructuralEqualityComparer());

于 2013-09-05T09:57:16.113 回答