【问题标题】:.Net FluentAssertions .Contains doesn't compare objects properly.Net FluentAssertions .Contains 不能正确比较对象
【发布时间】:2017-01-16 12:45:22
【问题描述】:

我正在使用 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);
        }

    }
}

但这会引发:

预期收集{

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

Program+Value { Id = 2 SomeValue = "Test" }} 包含

程序+值 { Id = 1 SomeValue = "测试" }

所以有几个问题:

  1. 为什么 Contains 没有按预期工作?

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

  3. 如何从类的集合中排除属性? 我看过this questionthis one,但它们似乎不适用于集合。此外,如果我尝试使用 PropertyPath,程序也不会编译。我正在使用 .Net Core,但我也尝试使用 4.6,但它也不起作用。

【问题讨论】:

    标签: c# fluent-assertions


    【解决方案1】:

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

    【讨论】:

    • 是的,但我想比较等效性,在这种情况下它不应该抛出异常,如下行所示:list2[0].Values[0].ShouldBeEquivalentTo(list1[ 0].值[0]);
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2019-05-29
    • 1970-01-01
    • 2019-07-14
    • 2022-01-09
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多