FluentAssertions на основе отражения равно - PullRequest
1 голос
/ 21 февраля 2012

У меня есть простой класс:

public class MyClass()
{
  public string Property1 {get;set;}
  public string Property2 {get;set;}
}

Можно ли как-то утверждать два экземпляра этого класса на равенство без реализации метода Equal (я думаю, здесь хорошо подойдет отражение)? Я не хочу применять Equal только для тестов).

1 Ответ

3 голосов
/ 21 февраля 2012

См. Этот отрывок из официальной документации: 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);
...