【发布时间】:2013-04-06 09:00:47
【问题描述】:
我已经构建了一些复杂的对象,我正在尝试通过进行一些单元测试来验证它是否正常工作。这涉及比较一些 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
- 我的自定义 Equals
现在我正在写这篇文章,一个想法出现了,我看到了一个潜在的问题。我看到它在内部使用字典。哪个可能充当某种哈希图,其中 int 是实际列表中的索引?这是否意味着我需要实现自定义 IEqualityComparer,而不是覆盖 equals?那么我的 getHashCode() 应该如何? (我猜这很关键,因为我认为它可能被用作字典中的键?)
【问题讨论】:
-
您是否有可能在课堂上覆盖了
Equals,但没有GetHashCode? -
如果您显示您的代码,这将更容易回答。
-
我明白,但在这种情况下,它是相当多的代码。正如我在上一段中提到的,我确实没有覆盖 GetHashCode。但是我还不太明白,我的 GetHashCode 应该是什么样子。
-
类T基本上包含4个Strings和一个Enum类型。
-
我不太明白它需要 GetHashCode 做什么。正如我所写,我认为它可能用于该字典中的键。但是,哈希码可能会发生冲突,对吧?此外,我的 equals 函数中有一些逻辑,它不是直接比较所有字符串 1 对 1,所以这意味着我基本上会实现这个功能两次,以确保相等的对象获得相同的哈希码,对吗?这感觉很奇怪......
标签: vb.net unit-testing assert