Как использовать Exclude в 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;}
}

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

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

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

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

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

это возможно?

5 ответов


о чем?

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

или вы можете выполнить регулярное выражение на пути к свойству, например

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

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

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

Я только что столкнулся с подобной проблемой, и последняя версия 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))
  );
некоторое время, чтобы понять, как это сделать, но это действительно полезно!

простым способом было бы установить утверждения о коллекции напрямую, в сочетании с ее исключением на 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"));

самый простой способ сделать это:

expected.ShouldBeEquivalentTo(actual, config => config.ExcludingMissingMembers());

на основе идеи RegEx match от Деннис Doomen это я смог заставить его работать

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

разница с Деннисом ответ: передача su.SelectedMemberPath, двойные задние косые черты, чтобы избежать квадратных скобок.