【问题标题】:FluentAssertions: equivalence of sorted listsFluentAssertions:排序列表的等价性
【发布时间】:2014-12-05 09:47:00
【问题描述】:

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

  1. 元素通过它们所持有的值进行比较,而不是通过引用(即它们相等,不相等)
  2. 列表中元素的顺序很重要

FluentAssertions(甚至 NUnit)中是否没有执行此操作的函数?

干杯!

【问题讨论】:

    标签: c# unit-testing nunit fluent-assertions


    【解决方案1】:

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

    例子:

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

    documentation 中阅读有关这些选项的更多信息。

    【讨论】:

    • 完美,正是我所希望的。感谢您向我介绍 options 参数! :)
    • 我花了太长时间才意识到Should().BeEquivalentTo() 显然与ShouldBeEquivalentTo() 不同......
    • 我在 5.0 中修复了这个问题。见github.com/fluentassertions/fluentassertions/pull/593
    • NotBeEquivalentTo 没有选项过载的任何特殊原因?我需要验证两个可枚举项是否等价,但顺序不同。
    【解决方案2】:

    在这里玩游戏迟到了,但我使用 here 的 Fluent Assertions 版本:

    actualRows.Should().BeEquivalentTo(expectedRows,options => options.WithStrictOrdering());

    它将检查所有属性的所有值是否相等,并且使用此选项,顺序很重要。如果顺序无关紧要,请省略选项参数,它将确保一个集合中的项目将存在于另一个集合中的某个位置。 希望这可以帮助某人

    【讨论】:

    • 使用最新的fluentassertions nuget,你必须按如下方式使用它:actualRows.Should().BeEquivalentTo(expectedRows,options => options.WithStrictOrdering());
    【解决方案3】:

    我认为你可以这样做:

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

    这只有在使用Object.Equal(element1, element2)时列表中的元素相等时才有效

    如果不是这种情况,那么您需要为列表中的 objedts 实现自己的 EqualityComparer,然后使用:

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

    【讨论】:

    • 我认为这是最简洁的。谢谢!
    【解决方案4】:

    来自this 的帖子。

    FA 2.0 中引入的较新的 ShouldBeEquivalentTo() 正在做一个 深入的结构比较并报告任何差异

    你可以这样实现。

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 已经试过了,不关心元素的顺序。编辑 -> 这也是我的想法,我只是希望我在某个地方忽略了一个函数。
      • 也许可以试试 SequenceEqual 和自定义相等比较器。
      【解决方案6】:

      在我与类似任务的斗争中发现了下一个方法:

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

      Collection Assertions Docs

      【讨论】:

        【解决方案7】:

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

        mySimpleCollection.Should().BeInDescendingOrder()myComplexCollection.Should().BeInDescendingOrder(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)

        【讨论】:

          【解决方案8】:

          Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert 类可能有一个响应您需要的方法。

          CollectionAssert.AreEqual Method (ICollection, ICollection, IComparer) 应该可以解决问题。

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

          【讨论】:

            猜你喜欢
            • 2021-01-03
            • 2020-06-03
            • 2022-04-27
            • 2021-12-17
            • 1970-01-01
            • 2021-10-02
            • 2011-08-23
            • 1970-01-01
            • 2021-02-12
            相关资源
            最近更新 更多