【问题标题】:Problem Unit Testing in VB.NETVB.NET 中的问题单元测试
【发布时间】:2011-10-28 02:45:50
【问题描述】:

我有以下代码:

<TestMethod()> _
Public Sub GetDirectoryEntryTest()
    Dim path As String = runner.getLDAPPath()
    Dim expected As DirectoryEntry = runner.GetDirectoryEntry()
    Dim actual As DirectoryEntry
    actual = LDAPBase.GetDirectoryEntry(path)
    Assert.AreEqual(expected, actual)
End Sub

此单元测试失败。 DirectoryEntry 对象完全相同,但对不同对象的引用不同。我来自 Java 背景,您总是拥有.equals()

我该怎么做才能正确评估并返回 true,因为对于所有意图和目的,对象都是相等的。有什么我可以像在 Java 中那样做的事情并覆盖 equals() 吗?

【问题讨论】:

  • 所有密集的目的?你的意思是所有意图和目的:)
  • 测试对我来说似乎运行良好。您要比较的两个对象不相等。
  • @mellamokb 那之后我觉得有点笨,哈哈

标签: .net vb.net unit-testing


【解决方案1】:

在什么意义上这两个条目相等?他们的 ToString() 是否相等?如果这足以认为它们在测试中相等,则将两个 ToString() 值相互比较。

如果您需要比较两个 DirectoryEntries,请实现自定义 IEqualityComparer 并使用它来比较测试中的相等性。

【讨论】:

    【解决方案2】:

    尝试将对象的路径与以下内容进行比较:

    Assert.AreEqual(expected.Path, actual.Path)
    

    这将比较底层路径(字符串类型)而不是对象引用。如果路径相同就足够了,你不应该覆盖任何东西。

    编辑:

    DirectoryEntry 是从 Object 继承 Equals 的引用类型,因此:

    来自Object.Equals Method

    Equals 的默认实现支持引用相等 引用类型和值类型的按位相等。参考 相等意味着被比较的对象引用引用 同一个对象。按位相等意味着被比较的对象有 相同的二进制表示。

    【讨论】:

    • 所以我想这是我的问题的一部分。我的断言实际上在比较什么?是比较引用,还是调用 DirectoryObject 中的某种 equals 方法?
    • 如果一个 equals 方法被调用,并不意味着你得到了值比较。您仍然可以调用 equals 并比较引用,这可能就是您的情况。 (见我的编辑。)
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2011-05-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多