FluentAssertions:排序列表的等价性

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

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

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

干杯!

默认情况下, 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.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());

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

我想你可以做到:

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

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

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

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

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

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

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

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

集合断言文档

我相信不。 但是你总是可以为此目的写一个扩展方法。 即

  public static void AreEqual(this IList left, IList right) { Assert.AreEqual(left.Count, right.Count); for (int i = 0; i < left.Count - 1; i++) { Assert.IsTrue(left[i].Equals(right[i])); } } 

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

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

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