断言两个 List < T > 是相等的?

我是 TDD 和 xUnit 的新手,所以我想测试我的方法,看起来像这样:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

有没有我可以使用的 Assert 方法

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });


Assert.Exact(expected, actual);

有这样的东西吗?

99223 次浏览

2021年4月1日最新情况

我推荐使用 FluentAssertions 流利的断言。它有一个巨大的智能感知友好的断言库,适用于包括 收藏品在内的许多用例

collection.Should().Equal(1, 2, 5, 8);
collection.Should().NotEqual(8, 2, 3, 5);
collection.Should().BeEquivalentTo(8, 2, 1, 5);

原始答案

XUnit. Net 识别集合,因此您只需要执行

Assert.Equal(expected, actual); // Order is important

您可以在 Collectionasserts.cs中看到其他可用的集合断言

对于 NUnit库集合比较方法有

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

还有

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

详情请浏览这里: CollectionAssert

MbUnit 也有类似于 NUnit 的集合断言: < a href = “ https://github.com/Gallio/MbUnit-v3/blob/master/src/MbUnit/Framework/Assert. 网址1”rel = “ noReferrer”> Assert.Collections.cs

在 XUnit (1.5)的当前版本中,您只需使用

平等的(预期的,实际的) ;

上面的方法将逐个元素对两个列表进行比较。 我不确定这是否适用于任何先前的版本。

使用 xUnit 时,如果您想选择要测试的每个元素的属性,可以使用 Assert.Collection。

Assert.Collection(elements,
elem1 => Assert.Equal(expect1, elem1.SomeProperty),
elem2 => {
Assert.Equal(expect2, elem2.SomeProperty);
Assert.True(elem2.TrueProperty);
});

这将测试预期的计数并确保每个操作都得到验证。

最近,我在 asp.net 核心2.2应用程序中使用了 xUnit 2.4.0Moq 4.10.1包。

在我的案例中,我设法通过两个步骤使它工作:

  1. 定义 IEqualityComparer<T>的实现

  2. 将比较器实例作为第三个参数传递给 Assert.True方法:

    Assert.True(expected, actual, new MyEqualityComparer());

但是还有另一种更好的方法来使用 FluentAssertions 流利的断言包获得相同的结果。它允许你做以下事情:

// Assert
expected.Should().BeEquivalentTo(actual));

有趣的是,即使我命令两个列表的元素以相同的顺序排列,Assert.Equal()也总是失败。

刚刚找到了 NotStrictequals 似乎可以做到这一点。