FluentAssessations:排序列表的等价性

本文关键字:列表 排序 FluentAssessations | 更新日期: 2023-09-27 18:26:16

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

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

FluentAssessments(甚至NUnit)中是否没有这样的函数?

干杯!

FluentAssessations:排序列表的等价性

默认情况下,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());

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

这里的游戏很晚,但我在这里使用的是Fluent Assertions版本:

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

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

我想你可以做:

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

只有当使用Object.Equal(element1, element2) 时,列表中的元素相等时,这才会起作用

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

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

来自本文。

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

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

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

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

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

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

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

收款断言文档

对于本问题的第2部分,检查集合中元素的顺序,截至2020年(不确定是哪个版本引入的,我目前使用的是v.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)

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

CollectionAssert.AreEqual方法(ICollection、ICollection和IComparer)应该做到这一点。

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