AutoFixture Likeness - сравнивать только совпадающие свойства - PullRequest
7 голосов
/ 18 февраля 2012

Я хочу иметь возможность сравнивать два следующих объекта по подобию, используя AutoFixture.SemanticComparison:

public class Object1
{
  public int a;
}

public class Object2
{
  public int a;
  public int b;
}

Теперь, когда я делаю это так:

var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2);

Я получаю следующее исключение: «Следующие участники не совпадают: - b.»

Я обнаружил, что могу опустить член 'b' следующим образом:

var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2);

Однако я считаю, что это довольно громоздко, потому что всякий раз, когда я добавляю нового члена в класс Object2, мне приходится исправлять свои модульные тесты (или, по крайней мере, помощников модульных тестов).

Есть ли способ сказать "Я хочу сравнить по подобию только для подмножества, которое существует в обоих объектах"?

1 Ответ

8 голосов
/ 18 февраля 2012

Звучит так, будто вы хотите сравнить два объекта на основе пересечения их свойств. В настоящее время это не поддерживается классом Likeness. Аргументация такова:

Прямо сейчас тип назначения (в приведенном выше примере это будет Object2) является решающим шаблоном, по которому выполняется сопоставление. Это обеспечивает довольно strong утверждение для утверждения: каждое открытое свойство или поле этого класса должно совпадать.

Однако утверждение о сопоставлении пересечения свойств будет очень слабым утверждением, поскольку это пересечение может быть пустым . Это может привести к ложным отрицаниям .

Даже если вы используете TDD и следите за циклом Красный / Зеленый / Рефакторинг и видели, что модульный тест не прошел с таким гипотетическим пересечением сходства, последующие рефакторинги могут превратить такое утверждение в ложное отрицание, поскольку вы удаляете последнее свойство или поле, которые имеют два общих объекта - и вы никогда не заметите.

Однако AutoFixture имеет открытый исходный код и все, поэтому вы можете предложить эту функцию или отправить запрос на извлечение.

...