从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做到这一点吗?

有帮助吗?

解决方案 3

我最终使用反思建立了自己的

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;
        }

其他提示

基本上, 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-equeraly-sertions-ingertions-in-mbunit-v3.html

您可能还想阅读 那篇文章 在Gallio Wiki中。

你是在寻找 参考平等? AreSame 正在测试两个引用指向同一对象。来自doco:

Assert.AreSame - 验证实际值是否与某些期望值相同。

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

Assert.AreEqual - 验证实际值等于一些期望值。

在Mbunit 3中,您可以使用structuralequalitycomparer:

Assert.AreElementSequal(OBJ1,OBJ2,新structuralequalityComparer());

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top