我正在尝试使用C#中的FluentAssertions建立两个列表的等价,其中有两件事是重要的:
FluentAssertions(甚至是NUnit)中是否没有这样做的功能?
干杯!
答案 0 :(得分:41)
默认情况下,ShouldBeEquivalentTo()
将忽略集合中的顺序,因为在大多数情况下,如果两个集合按任何顺序包含相同的项目,则它们是等效的。如果您确实关心订单,只需在WithStrictOrdering()
参数上使用options =>
的一个重载。
示例:
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());
中详细了解这些选项
答案 1 :(得分:8)
这里游戏的后期但是我使用了这个here的Fluent Assertions版本:
actualRows.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());
它将检查所有属性的所有值的等价性,并使用此选项设置订单计数。如果顺序无关紧要,在这种情况下省略选项参数,它将确保来自一个集合的项目将存在于另一个集合中的某个位置。 希望这有助于某人
答案 2 :(得分:4)
我认为你可以做到:
myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
这仅在使用Object.Equal(element1, element2)
如果不是这种情况,那么你需要为列表中的objedts实现自己的EqualityComparer然后使用:
myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
.Should().BeTrue();
答案 3 :(得分:1)
您需要ShouldAllBeEquivalentTo方法,该方法应该比较列表中两个对象图的属性值。
*编辑:我可能会使用与使用ShouldBeEquivalentTo关注元素顺序的自定义相等比较器相等的Linq Sequence。
答案 4 :(得分:1)
在与类似任务的斗争中发现了下一个方法:
IEnumerable collection = new[] { 1, 2, 5, 8 };
collection
.Should()
.ContainInOrder(new[] { 1, 5, 8 });
答案 5 :(得分:1)
来自this帖子。
FA 2.0中引入的更新的 ShouldBeEquivalentTo()正在 进行深入的结构比较,并报告任何差异
您可以通过这种方式实现。
actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
答案 6 :(得分:0)
Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert课程可能有一种方法可以满足您的需求。
CollectionAssert.AreEqual Method (ICollection, ICollection, IComparer)应该可以做到这一点。
如果两个集合在相同的元素中具有相同的元素,则它们是相等的 订单和数量。如果它们的值相等,则元素是相等的 如果他们引用同一个对象。
答案 7 :(得分:0)
对于该问题的第2部分,从2020年开始检查集合中元素的顺序(不确定引入的版本,当前使用的是v5.10.3),您可以使用:
mySimpleCollection.Should().BeInDescendingOrder()
或myComplexCollection.Should().BeInDescendingOrder(x => x.SomeProperty)
OR
mySimpleCollection.Should().BeInAscendingOrder()
或myComplexCollection.Should().BeInAscendingOrder(x => x.SomeProperty)
OR
mySimpleCollection.Should().NotBeInAscendingOrder()
或myComplexCollection.Should().NotBeInAscendingOrder(x => x.SomeProperty)
OR
mySimpleCollection.Should().NotBeInDescendingOrder()
或myComplexCollection.Should().NotBeInDescendingOrder(x => x.SomeProperty)