xUnit:断言两个List <T>是否相等?

Pet*_*rov 92 c# xunit

嗨,我是TDD和xUnit的新手所以我想测试我的方法,例如:

List<T> DeleteElements<T>(this List<T> a, List<T> b);
Run Code Online (Sandbox Code Playgroud)

当然这不是真正的方法:)我可以使用任何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);
Run Code Online (Sandbox Code Playgroud)

有这样的事吗?

Kon*_*rin 112

xUnit.Net可识别集合,因此您只需要这样做

Assert.Equal(expected, actual); // Order is important
Run Code Online (Sandbox Code Playgroud)

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

对于NUnit库集合,比较方法是

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters
Run Code Online (Sandbox Code Playgroud)

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter
Run Code Online (Sandbox Code Playgroud)

更多细节:CollectionAssert

MbUnit还有类似于NUnit的集合断言:Assert.Collections.cs

  • 对于具有相同内容的两个 IEnumerables,xUnit Equal 方法返回 false。 (8认同)

hwi*_*ers 29

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

Assert.Equal(expected,actual);

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

  • 我在Assert.Equal中遇到的问题是,如果集合的元素处于不同的顺序,它就会失败,即使这两个元素都存在. (7认同)
  • 但它的输出非常糟糕。它不会告诉您两个列表的不同之处!:( (4认同)
  • 如果集合类型不同,它似乎也会失败,即使它们都包含相同顺序的相同项目. (2认同)

Dre*_*ams 14

使用xUnit,你是否想要挑选每个元素的属性来测试你可以使用Assert.Collection.

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

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


Dmi*_*nov 5

最近,我在我的 asp.net core 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));
Run Code Online (Sandbox Code Playgroud)

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

  • 你的排序有问题 BeEquivalentTo 不关心顺序(这就是为什么你的测试通过 BeEquivalentTo 而不是 assert.Equal) (3认同)