我正在尝试对输入到文本框(txtPrice)的数据进行单元测试。如果它不是数字,它会抛出一个消息框,指出输入必须是数字。但是,当我进行单元测试时,我无法弄清楚为什么我的测试会触发消息框两次。 这是我的(简单)单元测试:
Public Sub txtBoxes_LeaveTest()
Dim target As frmEstimate_Accessor = New frmEstimate_Accessor ' TODO: Initialize to an appropriate value
Dim sender As Object = Nothing ' TODO: Initialize to an appropriate value
Dim e As EventArgs = Nothing ' TODO: Initialize to an appropriate value
sender = target.txtPrice.Text
target.txtPrice.Text = "112L"
Dim expected As String
Dim actual As String
expected = "112L"
target.txtBoxes_Leave(sender, e)
actual = target.txtPrice.Text
Assert.AreEqual(expected, actual, "txtPrice.leave event not functioning correctly")
End Sub
我的理解是,对于单元测试,您声明发件人,并且(在这种情况下)将发件人设置为某个值,该值将使消息框跳闸。 112L应该在休假活动中这样做。然后我写下我的预期,在这种情况下是112L,触发事件,然后从文本框中取出实际值。然后我Assert.AreEqual确保预期和实际相同。
首先,这是正确的吗?第二,为什么会两次开火?
谢谢。
答案 0 :(得分:3)
您不希望单元测试导致出现消息框。关于单元测试的一个重要部分是能够自动运行它们,而像MsgBox和文本框值这样的东西就会破坏它。
您想要做的是缩小测试范围。您的离开事件应该调用单独的验证方法。根据方法的结果,您的离开事件可能会对表单进行更改。该方法将接受一个字符串作为输入,并返回一个布尔值,无论该字符串是否有效,返回一个更正的字符串,或抛出一个异常。根据该方法编写测试。您要做的是进行单元测试,以验证此验证方法是否正在按预期进行。
答案 1 :(得分:2)
仅当过程名称处理不同的控制事件时才使用sender
。
Private Sub txtPrice_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPrice.Leave
If Not IsNumeric(txtPrice.Text) Then
MsgBox("txtPrice is not numeric!", MsgBoxStyle.Critical, "Error")
txtPrice.SelectAll()
txtPrice.Focus()
End If
End Sub