136

我是 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);

有这样的吗?

4

5 回答 5

176

2021 年 4 月 1 日更新

我建议使用FluentAssertions。它有一个庞大的 IntelliSense 友好断言库,适用于包括集合在内的许多用例

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 的集合断言:Assert.Collections.cs

于 2009-01-07T09:33:38.207 回答
39

在当前版本的 XUnit (1.5) 中,您可以使用

Assert.Equal(预期,实际);

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

于 2009-08-09T13:10:22.953 回答
19

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

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

这会测试预期计数并确保每个操作都经过验证。

于 2016-08-31T09:28:11.147 回答
5

最近,我在我的 asp.net core 2.2 应用程序中使用xUnit 2.4.0和包。Moq 4.10.1

就我而言,我设法通过两个步骤使其工作:

  1. 定义一个实现IEqualityComparer<T>

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

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

但是还有另一种更好的方法可以使用FluentAssertions包获得相同的结果。它允许您执行以下操作:

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

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

于 2019-04-26T10:03:59.930 回答
0

刚刚找到了似乎可以做到的 NotStrictEqual。

于 2021-08-25T12:06:37.637 回答