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

时间:2013-03-21 12:21:21

标签: c# unit-testing object compare xunit

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

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

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

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

5 个答案:

答案 0 :(得分:40)

这些答案对于这个问题来说太复杂了。比较两个列表没有必要的覆盖,您不需要打破多个断言。  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方法。

答案 1 :(得分:23)

如果您使用的是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; 
    }
}  

并在您的单元测试中:

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:0)

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

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