我使用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,类属性的行为符合预期。
答案 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并因此触发了我的对象的预加载的情况。