Утверждения Fluents: исключить поле рекурсивно - PullRequest
0 голосов
/ 30 октября 2019

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

class Person {
   public string Name;
   public string LastName;
   public Person Parent;
   public static int IdCounter = 0;
   public int Id;

   public Person(string name, string lastName, Person parent) {
      Name = name;
      LastName = lastName;
      Parent = parent;
      Id = IdCounter++;
   }
}

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

var expectedPerson = new Person ("John","Galecky", new Person("Sheldon", "Cooper", null));
var actualPerson = PersonGenerator.GetCurrentPerson();

И я хочу сравнитьони рекурсивно исключают поле Id, что означает для родителей тоже

actualPerson.Should().BeEquivalentTo(expectedPerson, (options) =>
            {
                options.Excluding(t => t.Id);
            });

Но ofc это работает только для Person первого уровня, как я могу исключить поле Id для Parent и его Parent и т. д., пока FluentAssertion может перейти в рекурсию(10 уровней в документации)? В этом примере это кажется совершенно необоснованным, но мне нужно именно это сделать, как это можно сделать?

1 Ответ

2 голосов
/ 30 октября 2019

Чтобы рекурсивно исключить участника, вы должны будете использовать Excluding(Expression<Func<IMemberInfo, bool>> predicate), который позволяет вам использовать шаблон, соответствующий пути к исключаемому участнику.

Например, вы хотите исключить

  • Id
  • Parent.Id
  • Parent.Parent.Id
  • ...

Поскольку каждый путь заканчиваетсяId Вы можете использовать

Excluding(ctx => ctx.SelectedMemberPath.EndsWith("Id"))
var expectedPerson = new Person("John", "Galecky", new Person("Sheldon", "Cooper", null));
var actualPerson = new Person("John", "Galecky", new Person("Sheldon", "Cooper", null));

actualPerson.Should().BeEquivalentTo(expectedPerson, options =>
    options.Excluding(ctx => ctx.SelectedMemberPath.EndsWith("Id")));

Имейте в виду, что это чистое совпадение строк. Если, например, у другого участника есть свойство Id, которое вы хотите включить , вы можете использовать этот способ, чтобы убедиться, что он соответствует только корневому идентификатору или любому Parent.Id.

Regex.IsMatch(ctx.SelectedMemberPath, @"^(Parent\.)*Id$")
...