我已经构建了一些复杂的对象,并且正在尝试通过进行一些单元测试来验证它是否正常工作。这涉及比较一些 List(Of T),所以我尝试使用 CollectionAssert。现在我遇到了一些奇怪的事情。
首先,我使用 CollectionAssert.AreEqual 来查看第一个列表是否相等。这个断言通过了。但是为了简单起见,我想使用 CollectionAssert.AreEqual,这样我就不必以正确的顺序创建预期的对象,所以我开始尝试。使用完全相同的代码,CollectionAssert.AreEquivalent 失败。我会说这很奇怪,因为等价是比等价更宽松的断言,对吧?我收到此错误:
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s) of <MyObject>. The actual collection contains 0 occurrence(s).
我试过调试,但我没有让它调试.Net框架,即使我设置了下载符号文件。所以我只能看到它进入我的自定义 Equals 函数一次 - 返回 true - 然后断言失败。两个对象都有两个元素。调用堆栈是(以相反的顺序):
- CollectionAssert.AreEquivalent
- CollectionAssert.AreEquivalent(重载)
- CollectionAssert.FindMisMatchedElement
- Generic.Dictionary(Of Object, int).TryGetValue
- Generic.Dictionary(Of Object, int).FindEntry
- Generic.ObjectEqualityComparer.Equals
- 我的自定义等于
现在我正在写这篇文章,一个想法出现了,我看到了一个潜在的问题。我看到它在内部使用字典。哪个可能充当某种哈希图,其中 int 是实际列表中的索引?这是否意味着我需要实现自定义 IEqualityComparer,而不是覆盖 equals?那么我的 getHashCode() 应该如何?(我猜这很关键,因为我认为它可能被用作字典中的键?)