Сравнение двух одинаковых объектов в MbUnit - PullRequest
3 голосов
/ 07 мая 2010

Из 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 ]

2 голосов
/ 12 мая 2010

По существу, 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.

0 голосов
/ 05 сентября 2013

В MbUnit 3 вы можете использовать StructuralEqualityComparer:

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

0 голосов
/ 10 мая 2010

Я закончил создание своего собственного, используя Reflections

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 голосов
/ 07 мая 2010

Вы специально ищете референтное равенство ? AreSame проверяет, что обе ссылки указывают на один и тот же объект. Из документа:

Assert.AreSame - Проверяет, что фактическое значение референциально совпадает с некоторым ожидаемым значением.

Если вы просто хотите сравнить, что два экземпляра объекта логически равны, тогда вам нужно AreEqual.

Assert.AreEqual - Проверяет, что фактическое значение равно некоторому ожидаемому значению.

...