[英]FluentAssertions: equivalence of sorted lists
我试图在 C# 中使用 FluentAssertions 建立两个列表的等价性,其中有两件事很重要:
FluentAssertions(甚至 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());
在文档中阅读有关这些选项的更多信息。
晚这里的比赛,但我用的这个流利断言版本在这里:
actualRows.Should().BeEquivalentTo(expectedRows,options => options.WithStrictOrdering());
它将检查所有属性的所有值是否相等,并且使用此选项,顺序很重要。 如果顺序无关紧要,请省略 options 参数,它将确保一个集合中的项目将存在于另一个集合中的某处。 希望这有助于某人
我认为你可以这样做:
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 年(不确定这是引入的哪个版本,目前使用的是 v5.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)应该可以解决问题。
如果两个集合具有相同顺序和数量的相同元素,则它们相等。 如果元素的值相等,则元素相等,而不是引用同一个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.