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


108

我是TDD和xUnit的新手,所以我想测试一下如下所示的方法:

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

有什么我可以使用的断言方法吗?我觉得这样会很好

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

有这样的东西吗?

Answers:


135

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



1
评论中的新链接也已损坏。
斯科特·斯塔福德,

1
现在,项目已移至GitHub,但我也无法在其中找到该特定源文件。
MEMark 2014年

1
对于复杂的对象,请不要忘记您需要使用Equal + GetHasCode才能使它起作用,或者为Equal方法提供自定义EqulityComparer
maracuja-juice

2
对于具有相等内容的两个IEnumerable,xUnit Equal方法返回false。
弗拉基米尔·科赞契奇

31

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

Assert.Equal(预期的,实际的);

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


7
我在使用Assert.Equal for collections时遇到的问题是,即使collection的元素处于不同的顺序,即使这两个元素同时存在,它也会失败。
斯科特·劳伦斯

1
@ ScottA.Lawrence列表也有顺序!使用HashSet会得到相同的行为吗?
2012年

@johv我没有用HashSets测试过,但这是一个好主意。一旦有机会尝试一下,我会尽量记住在这里回答。
Scott Lawrence

2
如果集合类型不同,即使它们都包含相同顺序的相同项目,这似乎也会失败。
James White

3
但是它的输出非常糟糕。它不会告诉您两个列表不同!:(
Zordid

16

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

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

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


2

最近,我在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));

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


2
您的订购BeEquivalentTo不在意订购有什么问题(这就是为什么您的测试通过BeEquivalentTo而未通过assert.Equal通过)
RagnaRock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.