FluentAssertions:排序列表的等效性

Sam*_*ber 22 c# nunit unit-testing fluent-assertions

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

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

FluentAssertions(甚至是NUnit)中没有这样做的功能吗?

干杯!

Den*_*men 50

默认情况下,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());
Run Code Online (Sandbox Code Playgroud)

阅读文档中有关这些选项的更多信息.

  • 花了我太久才意识到`应该().BeEquivalentTo()`显然与`ShouldBeEquivalentTo()`不一样.... (8认同)
  • 完美,正是我所希望的。感谢您向我介绍options参数!:) (2认同)

小智 8

晚这里的比赛,但我用的这个流利断言版本在这里:

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

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

  • 使用最新的 Fluentassertions nuget,您必须按如下方式使用它:actualRows.Should().BeEquivalentTo(expectedRows,options => options.WithStrictOrdering()); (3认同)

Sam*_*der 6

我认为你可以这样做:

myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
Run Code Online (Sandbox Code Playgroud)

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

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

myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
             .Should().BeTrue();
Run Code Online (Sandbox Code Playgroud)