VB.net: Как поднять события щелчка мыши / клавиатуры на собственных элементах управления
Предпосылки
Я хотел бы автоматически протестировать классы Windows Form в моем проекте. Я бы хотел провести тесты типа «Если кнопка
F5
был нажат, выполнялась ли функция xyz? ".
Для этого мне нужно инициировать события щелчка мыши или клавиатуры.
Окружающая обстановка
- Графический интерфейс: Windows Forms
- Платформа тестирования: MSTests
- Стиль тестирования: я не тестирую независимый exe-файл
Вопрос
Как я могу инициировать события щелчка мыши или клавиатуры на элементе управления?
+α: Как вызвать любое произвольное событие на произвольном элементе управления?
Конкретный пример у
меня есть
GridDataView
в моей продуктивной форме. В моем тесте я бегу
view.Row (0).selected = True
чтобы выбрать первую строку. Теперь я хотел бы вызвать событие doubleclick и
Keys.Enter
Ключевое событие для имитации этих взаимодействий с пользователем.
Что я пробовал до сих пор
-
view.PerformDoubleClick()
-
view.DoubleClick (Nothing,Nothing)
-
view.OnDoubleClick (Nothing)
-
RaiseEvent DoubleClick (Nothing,Nothing)
-
RaiseEvent view.DoubleClick (Nothing,Nothing)
Ни один из этих методов не работал; некоторые даже не компилируются
В этой статье Microsoft указано, что сделать то, что я пытаюсь, может оказаться невозможным.
Событие может быть вызвано только из области объявлений, в которой оно объявлено. Следовательно, класс не может вызывать события из любого другого класса, даже из того, от которого он является производным.
2 ответа
Единственное решение, которое я нашел, - создать подкласс каждого элемента управления (виджета), с которым вы хотите работать, и сделать их
On*()
методы
public
.
В приведенном ниже коде подклассы a позволяют
OnClick()
и методы, которые будут использоваться извне.
Imports System.Windows.Forms
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Public Class MyButton
Inherits Button
Public Shadows Sub OnClick (e As System.EventArgs)
MyBase.OnClick (e)
End Sub
Public Shadows Sub OnKeyDown (kevent As KeyEventArgs)
MyBase.OnKeyDown (kevent)
End Sub
End Class
Уведомления относительно:
- Хорошо: Звонок
OnKeyDown()
извне ничего не вызовет, еслиKeyPreview
установлен наFalse
. Это соответствует фактическим ключевым событиям и, следовательно, хорошо. - Плохо: ключевые события не будут заброшены.
РассмотримForm
иButton
иметьKeyDown
событие. Если пользователь нажимает клавишу на фактическом графическом интерфейсе пользователя, событие поступит на оба элемента управления / виджеты. Однако, используя метод, описанный здесь, событие будет запускаться только в том объекте, который был вызван.
Можете ли вы напрямую вызвать функцию OnClick() элемента управления? Достаточно ли этого для вашего теста?
Я помню, что событие невозможно смоделировать, хотя функцию можно вызвать извне. Это случилось и со мной.