. net FluentAssertions . contains不能正确比较对象

本文关键字:比较 对象 不能 FluentAssertions contains net | 更新日期: 2023-09-27 18:06:17

我正在使用FluentAssertions,我需要比较2个对象列表。它们来自包含Values属性的同一个类。

我想比较两个列表,但我希望list1中的所有值都存在于list2中,但忽略额外的值。像这样:

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);
        }
    }
}

但是这会抛出:

期望集合{

程序+值{Id = 1 SomeValue = "Test"},

程序+值{Id = 2 SomeValue = "Test"}}包含

程序+值{Id = 1 SomeValue = "Test"}

有几个问题:

  1. 为什么不包含工作的预期?

  2. 是否有可能在一行中做到这一点,例如将默认列表比较更改为使用Contains而不是ShouldBeEquivalentTo?

  3. 如何从类的集合中排除属性?我看过这个问题和这个问题,但它们似乎不适用于集合。此外,如果我尝试使用PropertyPath,程序不会编译。我正在使用。net Core,但我也尝试过4.6,它也不工作。

. net FluentAssertions . contains不能正确比较对象

我可以回答你的第一个问题,所以问题是对象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" }
            }
        }
    };

使用ShouldBeEquivalentTo即可。它将比较两个对象图的结构等价性。