Сравнивая два объекта, которые одинаковы в MBUNIT
-
04-10-2019 - |
Вопрос
От 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: вы можете захотеть реализовать структурное равенство для сравнения на основе отражения. Но Мбунит уже встроенный функция такая. Отказ Это называется 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/eavality-assertions-in-mbunit-v3.html.
Вы также можете прочитать эта статья в галлио вики.
Вы специально ищете Ссылочное равенство? AreSame
Тестирование того, что оба ссылки указывают на один и тот же объект. Из дока:
Assert.AreSame
- Проверяет, что фактическое значение передается определенному некоторому ожидаемому значению.
Если вы просто хотите сравнить, что два экземпляра объекта логически равны, то AreEqual
это то, что вам нужно.
Assert.AreEqual
- Проверяет, что фактическое значение равно некоторой ожидаемой стоимости.
В MBUNIT 3 вы можете использовать structuralequalitycomparer:
Assert.areelementsal (OBJ1, OBJ2, новый structuralequalityComparer ());