2012-02-18 2 views
6

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

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, я должен исправьте мои модульные тесты (или, по крайней мере, единичные тестовые помощники).

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

ответ

7

Похоже, вы хотели бы сравнить два объекта на основе перекрестка их свойств. В настоящее время этот класс не поддерживается классом Likeness. Обоснование таково:

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

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

Даже если вы TDDing и следуете за циклом Red/Green/Refactor, и вы видели, что единичный тест не прошел с таким гипотетическим пересечением Likeness, последующие рефакторинги могут превратить такое утверждение в False Negative, поскольку вы удаляете Последнее свойство или поле, которое имеют два объекта, - и вы никогда не заметите.

Однако AutoFixture имеет открытый исходный код и все, поэтому вы можете отправить suggest this feature или отправить запрос на тяну.

+1

Аргумент, который вы описали, довольно силен. Это заставило меня задуматься о том, что является более громоздким - добавление новых свойств в No() или отслеживание двух объектов для изменений имен свойств, чтобы избежать ложных срабатываний. Спасибо, что обратил мое внимание на это! –