.Net FluentAssertions。包含没有正确比较对象

时间:2016-09-08 14:18:56

标签: c# fluent-assertions

我使用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 =&#34;测试&#34; },

     

计划+价值{Id = 2 SomeValue =&#34;测试&#34;包含

     

计划+价值{Id = 1 SomeValue =&#34;测试&#34; }

所以有几个问题:

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

  2. 是否可以在一行中执行此操作,例如将默认列表比较更改为使用包含而不是使用ShouldBeEquivalentTo?

  3. 如何从类的集合中排除属性? 我查看了this questionthis one,但它们似乎并不适用于收藏品。此外,如果我尝试使用PropertyPath,程序也不会编译。我使用的是.Net Core,但我也尝试过使用4.6而且它也没有用。

2 个答案:

答案 0 :(得分:1)

我可以回答你的第一个问题所以问题在于对象 completionHandler() 在list1和list2中是两个完全独立且不同的对象,无论属性是否相等。 如果你修改它,它将按预期工作

new Value {Id = 1, SomeValue = "Test" }

答案 1 :(得分:0)

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