FluentAssertions:排序列表的等价性
我正在尝试使用C#中的FluentAssertions建立两个列表的等价,其中两件事很重要:
- 元素通过它们持有的值进行比较,而不是通过引用进行比较(即它们是等价的,不相等)
- 列表中元素的顺序很重要
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)应该可以解决问题。
如果两个集合在相同的顺序和数量中具有相同的元素,则它们是相等的。 如果元素的值相等,则元素相等,而不是它们引用相同的对象。