C# FluentAssertions:排序列表的等价性

C# FluentAssertions:排序列表的等价性,c#,unit-testing,nunit,fluent-assertions,C#,Unit Testing,Nunit,Fluent Assertions,我试图用C#中的FluentAssertions建立两个列表的等价性,其中有两件事很重要: 元素通过其持有的值进行比较,而不是通过引用进行比较(即,它们是等效的,而不是相等的) 列表中元素的顺序很重要 FluentAssertions(甚至NUnit)中是否没有执行此操作的函数 干杯 您需要shouldallbeeEquivalento方法,该方法应比较列表中两个对象图的属性值 *编辑:我可能会使用Linq Sequence equal和一个自定义相等比较器,该比较器使用shouldbeeEqu

我试图用C#中的FluentAssertions建立两个列表的等价性,其中有两件事很重要:

  • 元素通过其持有的值进行比较,而不是通过引用进行比较(即,它们是等效的,而不是相等的)
  • 列表中元素的顺序很重要
  • FluentAssertions(甚至NUnit)中是否没有执行此操作的函数


    干杯

    您需要shouldallbeeEquivalento方法,该方法应比较列表中两个对象图的属性值

    *编辑:我可能会使用Linq Sequence equal和一个自定义相等比较器,该比较器使用shouldbeeEqualetto来关心元素的顺序。

    该类可能有一个方法响应您的需要

    我们应该做到这一点

    如果两个集合在同一个集合中具有相同的元素,则它们是相等的 订单和数量。如果元素的值相等,则元素相等,而不是 如果它们指的是同一个对象


    我想你可以这样做:

    myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
    
    当使用
    Object.equal(element1,element2)

    如果情况并非如此,则需要为列表中的对象实现自己的EqualityComparer,然后使用:

    myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
                 .Should().BeTrue();
    

    默认情况下,
    shouldbeeeequivalento()
    将忽略集合中的顺序,因为在大多数情况下,如果两个集合以任何顺序包含相同的项,则它们是等效的。如果您确实关心顺序,只需在
    options=>
    参数上使用
    withstrictorring()
    的重载之一即可

    例如:

    var myList = Enumerable.Range(1, 5);
    var expected = new[]
    {
        1, 2, 3, 4, 5
    };
    
    //succeeds
    myList.ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
    
    //fails
    myList.Reverse().ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
    

    在。

    游戏后期阅读更多关于这些选项的信息,但我使用的是流畅的断言版本:

    actualRows.shouldbeevalentto(expectedRows,options=>options.withstritordering())

    它将检查所有属性的所有值是否相等,并使用此选项设置顺序计数。如果订单不重要,在这种情况下,忽略选项参数,它将确保一个集合中的项目将存在于另一个集合中的某个位置。
    希望这能帮助别人

    在我与类似任务的斗争中找到下一种方法:

    IEnumerable collection = new[] { 1, 2, 5, 8 };
    
    collection
        .Should()
        .ContainInOrder(new[] { 1, 5, 8 });
    

    来自post

    fa2.0
    中引入的较新的应该是等效的 深入的结构比较,并报告任何差异

    你可以通过这种方式实现它

    actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
    

    对于本问题的第2部分,检查集合中元素的顺序,从2020年起(不确定引入了哪个版本,目前使用的是v5.10.3),您可以使用:

    myImpleCollection.Should().beindescedingOrder()
    myComplexCollection.Should().beindescedingOrder(x=>x.SomeProperty)

    mySimpleCollection.Should().BeInAscendingOrder()
    myComplexCollection.Should().BeInAscendingOrder(x=>x.SomeProperty)

    mySimpleCollection.Should().NotBeInAscendingOrder()
    myComplexCollection.Should().NotBeInAscendingOrder(x=>x.SomeProperty)


    mySimpleCollection.Should().NotBeInDescendingOrder()
    myComplexCollection.Should().NotBeInDescendingOrder(x=>x.SomeProperty)

    已经尝试过了,不关心元素的顺序。编辑->这也是我的想法,我只是希望我忽略了某个函数。也许可以尝试SequenceEqual和自定义equality比较器。我认为这是最简洁的。谢谢完美,正是我所希望的。感谢您向我介绍选项参数!:)我花了太长时间才意识到
    Should()。beequivalento()
    显然与
    shouldbeequivalento()
    不同……我正在5.0中解决这个问题。查看NotbeeEquivalento没有选项重载的任何特定原因?我需要验证两个枚举数是否等效,但顺序不同。对于最新的fluentassertions nuget,您必须按如下方式使用它:actualRows.Should().BeEquivalentTo(expectedRows,options=>options.WithStrictOrdering());