FluentAssertions на основе отражения равно
У меня есть простой класс:
public class MyClass()
{
public string Property1 {get;set;}
public string Property2 {get;set;}
}
Можно ли как-то утверждать два экземпляра этого класса на равенство без реализации метода Equal (думаю, здесь хорошо подойдет отражение)? Я не хочу реализовывать Equal только для тестов).
1 ответ
Смотрите этот отрывок из официальной документации: http://fluentassertions.codeplex.com/documentation
Вы можете утверждать равенство целых объектов, сравнивая их свойства по имени. Это даже работает, если типы свойств различаются, но существует встроенное преобразование (через класс Convert). В качестве примера рассмотрим сущность Customer из некоторой произвольной модели домена и его DTO-аналог CustomerDto. Вы можете утверждать, что DTO имеет те же значения, что и объект, используя этот синтаксис:
dto.ShouldHave().AllProperties().EqualTo(customer);
До тех пор, пока все свойства dto также доступны для клиента и их значение равно или может быть преобразовано, утверждение успешно выполняется. Однако вы можете исключить определенное свойство, используя выражение свойства, например, свойство ID:
dto.ShouldHave().AllPropertiesBut(d => d.Id).EqualTo(customer);
Что эквивалентно:
dto.ShouldHave().AllProperties().But(d => d.Id).EqualTo(customer);
Возможен и обратный путь. Поэтому, если вы хотите включить только два конкретных свойства, используйте этот синтаксис.
dto.ShouldHave().Properties(d => d.Name, d => d.Address).EqualTo(customer);
И, наконец, если вы хотите сравнить только те свойства, которые имеют оба объекта, вы можете использовать метод SharedProperties() следующим образом:
dto.ShouldHave().SharedProperties().EqualTo(customer);
Очевидно, что вы можете связать это с помощью метода But(), чтобы исключить некоторые общие свойства.
Кроме того, вы можете повысить уровень структурного сравнения, добавив свойство InclusiveNestedObjects. Это даст команду сравнения для сравнения всех (наборов) сложных типов, к которым относятся свойства объекта (в этом примере). По умолчанию будет подтверждено, что вложенные свойства объекта соответствуют вложенным свойствам ожидаемого объекта. Однако, если вы укажете SharedProperties, он будет сравнивать только свойства с одинаковыми именами между вложенными объектами. Например:
dto.ShouldHave().SharedProperties().IncludingNestedObjects.EqualTo(customer);