单元测试无法解释的代码行为

时间:2013-09-19 18:12:25

标签: vb.net unit-testing nunit

我使用VS 2012在NUnit测试下有以下对象(来自Delphi的简化端口)。

Public Class Class1
  Private fLoaded As Boolean
  Private fSample As String

  Private Sub LoadFromDB()
    If (fLoaded) Then
      Exit Sub
    End If

    fLoaded = True
    ' fDataModule.LoadFromDB(Me)
  End Sub

  Public Property SampleProp() As String
    Get
  LoadFromDB()
      Return fSample
    End Get
    Set(ByVal value As String)
      fSample = value
    End Set
  End Property

  Public Property Loaded() As Boolean
    Get
      Return fLoaded
    End Get
    Set(ByVal value As Boolean)
      fLoaded = value
    End Set
  End Property
End Class

该对象假设在访问其属性时执行按需加载。以下Nunit类正在测试该属性。

Imports NUnit.Framework

<TestFixture> _
Public Class TestClass1

  <Test()> _
  Public Sub TestProperties()
    Dim TheClass As Class1

    TheClass = New Class1
    TheClass.Loaded = True

    TheClass.SampleProp = "Sample"
    TheClass.Loaded = False

    Assert.AreEqual("Sample", TheClass.SampleProp)

  End Sub

End Class

出现的问题是,在Assert语句中有一个断点,类属性Loaded在调试器中显示为True,而我的任何代码都没有被设置内部变量。最终结果是我的按需加载不会被执行。

什么是改变物业的价值?在Delphi中,使用DUnit,类属性的行为符合预期。

2 个答案:

答案 0 :(得分:1)

Adrian对此是正确的,Assert行正在触发要设置的标志。这个问题看起来很有趣,所以我复制了它以查看它在做什么。我做了一些小改动:

Public Class Class1
    Private fLoaded As Boolean = False      ' vars in MY code are never nothing
    Private fSample As String = ""          '    without my say so

  ...

Private Sub LoadFromDB()
  If (fLoaded) Then
    Exit Sub
  End If

  fLoaded = True
  Debug.Print("Now, all your datas are belong to me.")
End Sub

在Test class中:

Public Sub TestProperties()
  Dim TheClass As New Class1

    TheClass.Loaded = True
    TheClass.SampleProp = "Sample"
    TheClass.Loaded = False
    TheClass.SampleProp = "Not Sample"


    Debug.Assert(("Sample" = TheClass.SampleProp), "Msg")
End Sub

大多数变化毫无意义。 LoadFromDB()中的打印行用于确定负载点火的WHEN WHEN。 Assert IS 导致DataLoad。在Debug它看起来是自发的和怪异的在Assert线上并跳转到Load程序,但这就是你如何写它。

由于没有设置一个道具触发了加载,TheClass.SampleProp = "Sample"就加载标志而言什么都不做。所以就在断言之前我补充道:

    If TheClass.SampleProp = "Not Sample" Then
        Debug.Print("Test did that")
    End If

由于属性Get而导致数据加载,并且Assert不再执行,因为我的新行也将加载的标志设置为true。似乎所有这些都应该根据它的编写方式而有效。

编辑: 我还原了变量声明并添加了一个Sub New:

    Private fLoaded As Boolean 
    Private fSample As String 

Public Sub New()
    Debug.Print("New == {0}", fLoaded)
End Sub

New始终将成员var报告为False。但是在Debug中,mouseover确实将Property值显示为True

奇怪的是,到了断言时,Loaded已经设置并重置,那么你可能会认为它是准确的。如果您在Assert中跟踪Property Get语句,您将看到fLoaded最初为false。

之后就会发生同样的事情
    Dim TheClass As New Class1

即使New刚刚报告为False,鼠标弹出也会显示True。

由于通过初始化fLoaded来解决这两个错误,因此在处理未初始化的变量时,Loaded的鼠标悬停值显示中出现错误。

经验教训是,尽可能初始化变量。

答案 1 :(得分:0)

我遇到调试器的对象预览触发了getter并因此触发了我的对象的预加载的情况。