Проверка эквивалентности списков путем включения свойств во вложенные списки с помощью Fluent Assertions - PullRequest
0 голосов
/ 14 июня 2019

Есть ли способ утверждать эквивалентность двух списков объектов по свойствам, расположенным во вложенном списке? Я знаю, что вы можете проверить эквивалентность с помощью OnlyAllBeEquivalentTo () и Include () только определенных свойств, но я хотел бы вызвать Include () для свойства, определенного во вложенном списке:

class A
{
    public B[] List { get; set; }
    public string SomePropertyIDontCareAbout { get; set; }
}

class B
{
    public string PropertyToInclude { get; set; }
    public string SomePropertyIDontCareAbout { get; set; }
}

var list1 = new[]
{
    new A
    {
        List = new[] {new B(), new B()}
    },
};
var list2 = new[]
{
    new A
    {
        List = new[] {new B(), new B()}
    },
};

list1.ShouldAllBeEquivalentTo(list2, options => options
    .Including(o => o.List.Select(l => l.PropertyToInclude))); // doesn't work

1 Ответ

1 голос
/ 15 июня 2019

В настоящее время нет идиоматического способа достичь этого, но API достаточно гибок, чтобы сделать это, хотя и более громоздким способом.

Существует открытый вопрос об этой проблеме, в котором также перечислены некоторые решения.

С текущим API (версия 5.7.0) ваш опубликованный пример может быть подтвержденвключив только свойство List, а затем исключив свойства, заканчивающиеся на "SomePropertyIDontCareAbout".

var list1 = new[]
{
    new A
    {
        SomePropertyIDontCareAbout = "FOO",
        List = new[]
        {
            new B()
            {
                PropertyToInclude = "BAR",
                SomePropertyIDontCareAbout = "BAZ"
            },
        }
    },
};

var list2 = new[]
{
    new A
    {
        SomePropertyIDontCareAbout = "BOOM",
        List = new[]
        {
            new B()
            {
                PropertyToInclude = "BAR",
                SomePropertyIDontCareAbout = "BOOM"
            },
        }
    },
};

// Assert
list1.Should().BeEquivalentTo(list2, opt => opt
    .Including(e => e.List)
    .Excluding(e => e.SelectedMemberPath.EndsWith(nameof(B.SomePropertyIDontCareAbout))));
...