我第一次在visual studio c#中编写测试用例我有一个返回对象列表的方法,我想通过使用该Assert.AreEqual()
方法将它与另一个对象列表进行比较。
我尝试这样做,但即使两个对象相同,断言也会失败。
我想知道这个方法,两个参数是比较引用还是对象的内容,
我是否必须重载==
操作员才能完成这项工作?
我第一次在visual studio c#中编写测试用例我有一个返回对象列表的方法,我想通过使用该Assert.AreEqual()
方法将它与另一个对象列表进行比较。
我尝试这样做,但即使两个对象相同,断言也会失败。
我想知道这个方法,两个参数是比较引用还是对象的内容,
我是否必须重载==
操作员才能完成这项工作?
这些答案对于这个问题来说太复杂了。比较两个列表不需要覆盖,也不需要分解多个断言。Microsoft 使用以下类 CollectionAssert。
CollectionAssert.AreEqual(expectedList, actualList)
这适用于列表、字典和任何其他实现 ICollection 接口的东西。
microsoft 文档位于以下位置,详细说明了可以对集合进行的各种类型的断言
但是,正如@Bart 所提到的,这在(复杂)对象列表中无法正常工作,并且对于这些情况,可能仍需要覆盖 Equals 方法。
如果您正在使用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());
您可以将它们序列化并测试生成的字符串。
.NET 上的Assert.AreEqualxUnit
将检查对象是否相同,但是对象标识与值相等不同,这似乎是您在寻找值相等。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() 比较引用。通常在比较列表时,我会比较项目的数量,而不是列表中一个确切项目的某些属性,或者直接比较列表中的项目(但它也是参考)。
如果您想按内容比较对象,则必须实现一些递归对象比较器,但我认为它不适合单元测试,因为您希望它们始终尽可能快地运行。