46

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

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

FluentAssertions(甚至 NUnit)中没有这样做的功能吗?

干杯!

4

8 回答 8

92

默认情况下,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());

在文档中阅读有关这些选项的更多信息。

于 2014-10-10T10:40:30.093 回答
13

游戏迟到了,但我在这里使用了 Fluent Assertions版本

actualRows.Should().BeEquivalentTo(expectedRows,options => options.WithStrictOrdering());

它将检查所有属性的所有值是否相等,并且使用此选项,顺序很重要。如果顺序无关紧要,请省略选项参数,它将确保一个集合中的项目将存在于另一个集合中的某个位置。希望这可以帮助某人

于 2017-03-14T15:22:42.130 回答
6

我认为你可以这样做:

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

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

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

myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
             .Should().BeTrue();
于 2014-10-10T09:43:02.863 回答
3

这个帖子。

引入的较新的ShouldBeEquivalentTo()FA 2.0进行了深入的结构比较,并报告了任何差异

您可以通过这种方式实现它。

actual.Should().BeEquivalentTo(expectation, c => c.WithStrictOrdering());
于 2020-02-25T02:47:19.127 回答
1

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

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

于 2014-10-10T09:21:32.493 回答
1

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

IEnumerable collection = new[] { 1, 2, 5, 8 };

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

集合断言文档

于 2018-01-26T12:52:00.103 回答
1

对于这个问题的第 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)

于 2020-04-13T17:18:01.010 回答
0

Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert类可能具有响应您需要的方法。

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

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

于 2014-10-10T09:27:14.463 回答