FluentAssessations:排序列表的等价性
本文关键字:列表 排序 FluentAssessations | 更新日期: 2023-09-27 18:26:16
我试图在C#中使用FluentAssessments来建立两个列表的等价性,其中有两件事很重要:
- 这些元素是通过它们所保持的值进行比较的,而不是通过引用(即它们是相等的,而非相等的)
- 列表中元素的顺序很重要
FluentAssessments(甚至NUnit)中是否没有这样的函数?
干杯!
默认情况下,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)应该做到这一点。
如果两个集合在同一个集合中具有相同的元素,则它们是相等的订单和数量。如果元素的值相等,则元素相等如果它们指的是同一对象。