Как использовать 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, двойные задние косые черты, чтобы избежать квадратных скобок.