使用Assert.AreEqual()比较两个对象

我是第一次在visual studio中编写测试用例c#我有一个方法返回一个对象列表,我想通过使用Assert.AreEqual()方法将它与另一个对象列表进行比较。

我试过这样做,但即使两个对象相同,断言也会失败。

我想知道这个方法,这两个参数是比较引用还是对象的内容,

我是否必须重载==运算符才能使其工作?

如果您使用的是NUnit这就是文档所说的内容

从2.2版开始,还对比较单维数组进行了特殊规定。 如果两个数组的长度相同且每个相应的元素相等,则Assert.AreEqual将两个数组视为相等。 注意:目前不支持多维数组,嵌套数组(数组数组)和其他集合类型(如ArrayList)。

通常,如果要比较两个对象并且希望具有基于值的相等性,则必须覆盖Equals方法。

要实现您的目标,请尝试以下方法:

 class Person { public string Firstname {get; set;} public string Lastname {get; set;} public override bool Equals(object other) { var toCompareWith = other as Person; if (toCompareWith == null) return false; return this.Firstname == toCompareWith.Firstname && this.Lastname == toCompareWith.Lastname; } } 

在你的unit testing中:

 Assert.AreEqual(expectedList.ToArray(), actualList.ToArray()); 

这些答案对于这个问题来说太复杂了。 比较两个列表没有必要的覆盖,您不需要打破多个断言。 Microsoft使用以下类CollectionAssert。

 CollectionAssert.AreEqual(expectedList, actualList) 

这适用于Lists,Dictionaries以及其他任何实现ICollection接口的内容。

microsoft文档位于以下位置,并详细说明了可以对集合进行的各种类型的断言

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.aspx

但是,正如@Bart所提到的,这在(复杂)对象列表中不能正常工作,并且对于这些情况,可能仍需要覆盖Equals方法。

您可以序列化它们并测试生成的字符串。

.NET中的xUnit Assert.AreEqual将检查对象是否相同,但是对象标识与值equallity不同,看起来您正在寻找值相等。 IE浏览器。 “我的列表中的对象是否具有相同的值?” 这就是为什么它“失败”,即使每个列表中每个对象的值可能代表相同的值,两个列表也不相同。

通常在测试工作中,它应该足以测试集合和关键元素的数量。

 var count = listA.Count; Assert.AreEqual(count,listB.Count); Assert.AreEqual(listA.First(),listB.first()); Assert.AreEqual(listA.Last(),listB.Last()); Assert.AreEqual(listA[count/2],listB[count/2]); 

最后一个测试不必位于中间元素,只是为了测试列表中的元素,它不是随机元素的唯一原因是因为您希望能够重现测试结果。

Assert.AreEqual()比较引用。 通常在比较列表时,我会比较项目的计数和列表中一个确切项目的某些属性,或直接比较列表中的项目(但同样也是参考)。

如果你想按内容比较对象而不是实现一些递归的Object Comparer,但我认为它不适合unit testing,因为你希望它们总是尽可能快地运行。