Как использовать Исключить в 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"));