.Net FluentAssertions .Contains неправильно сравнивает объекты

Я использую FluentAssertions, и мне нужно сравнить 2 списка объектов. Они из того же класса, который содержит свойство Values.

Я хочу сравнить оба списка, но я хочу, чтобы все значения из списка1 существовали в списке2, но игнорируют дополнительные значения. Что-то вроде этого:

using System.Collections.Generic;
using FluentAssertions;

public class Program
{

    public class Value
    {
        public int Id { get; set; }
        public string SomeValue { get; set; }
    }

    public class MyClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Value> Values { get; set; }
    }


    public static void Main()
    {
        var list1 = new List<MyClass>
        {
            new MyClass
            {
                Id = 1,
                Name = "Name 1",
                Values = new List<Value>
                {
                    new Value {Id = 1, SomeValue = "Test" }
                }
            }
        };

        var list2 = new List<MyClass>
        {
            new MyClass
            {
                Id = 1,
                Name = "Name 1",
                Values = new List<Value>
                {
                    new Value {Id = 1, SomeValue = "Test" },
                    new Value {Id = 2, SomeValue = "Test" }
                }
            }
        };

        list2.Should().HaveSameCount(list1);

        // This doesn't throw, just proving that the first object is equivalent
        list2[0].Values[0].ShouldBeEquivalentTo(list1[0].Values[0]);
        for (var x = 0; x < list2.Count; x++)
        {
            list2[x].ShouldBeEquivalentTo(list1[x], options => options.Excluding(s => s.Values));
            // This throws, but it shouldn't
            list2[x].Values.Should().Contain(list1[x].Values);
        }

    }
}

Но это бросает:

Ожидаемая коллекция {

Program+Value {Id = 1 SomeValue = "Test"},

Program+Value { Id = 2 SomeValue = "Test" }} для содержания

Program+Value {Id = 1 SomeValue = "Test"}

Итак, несколько вопросов:

  1. Почему «Содержит» не работает должным образом?

  2. Можно ли сделать это в одной строке, например, изменив сравнение списка по умолчанию, чтобы использовать Contains вместо ShouldBeEquivalentTo?

  3. Как исключить свойство из коллекции класса? Я просмотрел этот вопрос и этот но они, кажется, не применяются к коллекциям. Кроме того, программа не компилируется, если я пытаюсь использовать PropertyPath. Я использую .Net Core, но пробовал и с 4.6, тоже не работает.


person Ricardo Smania    schedule 08.09.2016    source источник


Ответы (2)


Я могу ответить на ваш первый вопрос, так что проблема в том, что объекты new Value {Id = 1, SomeValue = "Test" } в list1 и list2 — это два совершенно отдельных и разных объекта, независимо от того, что свойства равны. Если вы измените его на это, он будет работать так, как вы ожидаете

    var commonValue = new Value { Id = 1, SomeValue = "Test" };

    var list1 = new List<MyClass>
    {
        new MyClass
        {
            Id = 1,
            Name = "Name 1",
            Values = new List<Value>
            {
                commonValue
            }
        }
    };

    var list2 = new List<MyClass>
    {
        new MyClass
        {
            Id = 1,
            Name = "Name 1",
            Values = new List<Value>
            {
                commonValue,
                new Value {Id = 2, SomeValue = "Test" }
            }
        }
    };
person Bozhidar Grigorov    schedule 08.09.2016
comment
Да, но я хочу сравнить эквивалентность, и в этом случае он не должен вызывать исключение, как показано в этой строке: list2[0].Values[0].ShouldBeEquivalentTo(list1[0].Values[0]) ; - person Ricardo Smania; 09.09.2016

Просто используйте ShouldBeEquivalentTo. Он сравнивает два графа объектов на структурную эквивалентность.

person Dennis Doomen    schedule 08.09.2016
comment
Это не работает, потому что мне нужно игнорировать дополнительные элементы в одной из коллекций. - person Ricardo Smania; 09.09.2016
comment
См. continuousimprover.com/2012/09/. - person Dennis Doomen; 17.09.2016