C# FluentAssertions:排序列表的等价性
我试图用C#中的FluentAssertions建立两个列表的等价性,其中有两件事很重要:C# FluentAssertions:排序列表的等价性,c#,unit-testing,nunit,fluent-assertions,C#,Unit Testing,Nunit,Fluent Assertions,我试图用C#中的FluentAssertions建立两个列表的等价性,其中有两件事很重要: 元素通过其持有的值进行比较,而不是通过引用进行比较(即,它们是等效的,而不是相等的) 列表中元素的顺序很重要 FluentAssertions(甚至NUnit)中是否没有执行此操作的函数 干杯 您需要shouldallbeeEquivalento方法,该方法应比较列表中两个对象图的属性值 *编辑:我可能会使用Linq Sequence equal和一个自定义相等比较器,该比较器使用shouldbeeEqu
干杯 您需要shouldallbeeEquivalento方法,该方法应比较列表中两个对象图的属性值 *编辑:我可能会使用Linq Sequence equal和一个自定义相等比较器,该比较器使用shouldbeeEqualetto来关心元素的顺序。该类可能有一个方法响应您的需要 我们应该做到这一点 如果两个集合在同一个集合中具有相同的元素,则它们是相等的 订单和数量。如果元素的值相等,则元素相等,而不是 如果它们指的是同一个对象
我想你可以这样做:
myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
当使用Object.equal(element1,element2)
如果情况并非如此,则需要为列表中的对象实现自己的EqualityComparer,然后使用:
myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
.Should().BeTrue();
默认情况下,
shouldbeeeequivalento()
将忽略集合中的顺序,因为在大多数情况下,如果两个集合以任何顺序包含相同的项,则它们是等效的。如果您确实关心顺序,只需在options=>
参数上使用withstrictorring()
的重载之一即可
例如:
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.shouldbeevalentto(expectedRows,options=>options.withstritordering())代码>
它将检查所有属性的所有值是否相等,并使用此选项设置顺序计数。如果订单不重要,在这种情况下,忽略选项参数,它将确保一个集合中的项目将存在于另一个集合中的某个位置。
希望这能帮助别人在我与类似任务的斗争中找到下一种方法:
IEnumerable collection = new[] { 1, 2, 5, 8 };
collection
.Should()
.ContainInOrder(new[] { 1, 5, 8 });
来自post
fa2.0
中引入的较新的应该是等效的
深入的结构比较,并报告任何差异
你可以通过这种方式实现它
actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
对于本问题的第2部分,检查集合中元素的顺序,从2020年起(不确定引入了哪个版本,目前使用的是v5.10.3),您可以使用:
myImpleCollection.Should().beindescedingOrder()
或myComplexCollection.Should().beindescedingOrder(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)
已经尝试过了,不关心元素的顺序。编辑->这也是我的想法,我只是希望我忽略了某个函数。也许可以尝试SequenceEqual和自定义equality比较器。我认为这是最简洁的。谢谢完美,正是我所希望的。感谢您向我介绍选项参数!:)我花了太长时间才意识到Should()。beequivalento()
显然与shouldbeequivalento()
不同……我正在5.0中解决这个问题。查看NotbeeEquivalento没有选项重载的任何特定原因?我需要验证两个枚举数是否等效,但顺序不同。对于最新的fluentassertions nuget,您必须按如下方式使用它:actualRows.Should().BeEquivalentTo(expectedRows,options=>options.WithStrictOrdering());