FluentAssertions:排序列表的等效性

时间:2014-10-10 09:08:29

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

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

  1. 元素通过它们所持有的值进行比较,而不是通过引用(即它们是等价的,不相等的)
  2. 进行比较
  3. 列表中元素的顺序很重要
  4. FluentAssertions(甚至是NUnit)中是否没有这样做的功能?

    干杯!

8 个答案:

答案 0 :(得分:41)

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

示例:

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

中详细了解这些选项

答案 1 :(得分:8)

这里游戏的后期但是我使用了这个here的Fluent Assertions版本:

actualRows.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());

它将检查所有属性的所有值的等价性,并使用此选项设置订单计数。如果顺序无关紧要,在这种情况下省略选项参数,它将确保来自一个集合的项目将存在于另一个集合中的某个位置。 希望这有助于某人

答案 2 :(得分:4)

我认为你可以做到:

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

这仅在使用Object.Equal(element1, element2)

时列表中的元素相同时才有效

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

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

答案 3 :(得分:1)

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

*编辑:我可能会使用与使用ShouldBeEquivalentTo关注元素顺序的自定义相等比较器相等的Linq Sequence。

答案 4 :(得分:1)

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

IEnumerable collection = new[] { 1, 2, 5, 8 };

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

Collection Assertions Docs

答案 5 :(得分:1)

来自this帖子。

FA 2.0中引入的更新的 ShouldBeEquivalentTo()正在 进行深入的结构比较,并报告任何差异

您可以通过这种方式实现。

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

答案 6 :(得分:0)

Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert课程可能有一种方法可以满足您的需求。

CollectionAssert.AreEqual Method (ICollection, ICollection, IComparer)应该可以做到这一点。

  

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

答案 7 :(得分:0)

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

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

OR

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

OR

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

OR

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