Как использовать Исключить в FluentAssertions для свойства в коллекции?

У меня есть два класса:

public class ClassA
{
  public int? ID {get; set;}
  public IEnumerable<ClassB> Children {get; set;}
}

public class ClassB
{
  public int? ID {get; set;}
  public string Name {get; set;}
}

Я хочу использовать текущие утверждения для сравнения с экземплярами ClassA. Однако я хочу игнорировать идентификаторы (поскольку идентификаторы будут назначены после сохранения).

Я знаю, что могу это сделать:

expectedA.ShouldBeEquivalentTo(actualA, options => options.Excluding(x => x.PropertyPath == "Children[0].ID"));

Который я, очевидно, могу повторить для каждого класса В коллекции. Однако я ищу способ исключить все идентификаторы (вместо того, чтобы делать исключение для каждого элемента).

Я прочитал этот вопрос, однако, если я удаляю индексы индекса [0], утверждения терпят неудачу.

Возможно ли это?

Ответы

Ответ 1

Как насчет?

expected.ShouldBeEquivalentTo(actualA, options => options.Excluding(su => 
   (su.RuntimeType == typeof(ClassB)) && (su.PropertyPath.EndsWith("Id")));`

Или вы можете выполнить соответствие RegEx в пути свойств, например

expected.ShouldBeEquivalentTo(actualA, options => options.Excluding(su => (Regex.IsMatch
   ("Children\[.+\]\.ID"));

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

expected.ShouldBeEquivalentTo(actualA, options => options
  .Excluding(su => su.PathMatches("Children[*].ID")));

Ответ 2

Я только что столкнулся с подобной проблемой, и последняя версия FluentAssertions немного изменила ситуацию.

Мои объекты содержат словари других объектов. Объекты в словарях содержат другие объекты, которые я хочу исключить. Сценарий, который у меня есть, заключается в тестировании сериализации Json, где я игнорирую определенные свойства.

Это работает для меня:

gotA.ShouldBeEquivalentTo(expectedB , config => 
  config
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Venue))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Exhibit))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Content))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Survey))
    .Excluding(ctx => ctx.SelectedMemberInfo.MemberType == typeof(Media))
  );

Подумал, как это сделать, но это действительно полезно!

Ответ 3

Простым способом было бы установить утверждения на сбор непосредственно, в сочетании с его исключением на утверждение ClassA эквивалентности:

expectedA.ShouldBeEquivalentTo(expectedB,
   o => o.Excluding(s => s.PropertyInfo.Name == "Children"));
expectedA.Children.ShouldBeEquivalentTo(expectedB.Children,
   o => o.Excluding(s => s.PropertyInfo.Name = "Id"));