VB.net: как вызывать события щелчка мыши/клавиатуры на родных элементах управления

avatar
DarkTrick
9 августа 2021 в 03:31
268
2
0

Фон
Я хотел бы автоматически протестировать классы Windows Form в своем проекте. Я хотел бы провести такие тесты, как «Если была нажата кнопка F5, была ли выполнена функция xyz?».

Для этого мне нужно инициировать события щелчка мышью или клавиатуры.

Окружающая среда

  • Графический интерфейс: Windows Forms
  • Среда тестирования: MSTests
  • Стиль тестирования: я не тестирую независимый исполняемый файл

Вопрос
Как я могу инициировать события щелчка мышью или клавиатуры в элементе управления?

+α: Как инициировать любое произвольное событие на произвольном элементе управления?

Конкретный пример
У меня есть GridDataView в продуктивной форме. В моем тесте я запускаю view.Row (0).selected = True, чтобы выбрать первую строку. Теперь я хочу инициировать событие двойного щелчка и событие Key Keys.Enter, чтобы имитировать эти взаимодействия с пользователем.

Что я уже пробовал

  • view.PerformDoubleClick()
  • view.DoubleClick (Nothing,Nothing)
  • view.OnDoubleClick (Nothing)
  • RaiseEvent DoubleClick (Nothing,Nothing)
  • RaiseEvent view.DoubleClick (Nothing,Nothing)

Ни один из этих методов не сработал; некоторые даже не компилируются

В этой статье Microsoft указывается, что то, что я пытаюсь выполнить, может оказаться невозможным

Событие может быть вызвано только из пространства объявления, в котором оно объявлено. Следовательно, класс не может вызывать события из любого другого класса, даже из того, от которого он является производным.

Источник
Hursey
9 августа 2021 в 03:40
0

Вы спрашиваете здесь об автоматических тестах пользовательского интерфейса? Если это так, я действительно предостерег бы от встраивания чего-либо непосредственно в ваше программное обеспечение, поскольку вы можете обнаружить, что это либо вызывает несущественные ошибки, либо скрывает настоящие ошибки. На самом деле нет никакой альтернативы тому, чтобы просто засучить рукава и сделать это самостоятельно. Тем не менее, уже доступно множество инструментов для автоматизированного тестирования графического интерфейса.

DarkTrick
9 августа 2021 в 03:47
0

Возможно недоразумение. Я попытался уточнить вопрос: я не тестирую exe, но тестирую MSTest в стиле модульного теста.

jmcilhinney
9 августа 2021 в 03:52
1

Вы не используете модульные тесты или что-то вроде модульных тестов для тестирования пользовательского интерфейса. Сделайте, как уже было сказано, изучите инструменты автоматизированного тестирования графического интерфейса.

DarkTrick
9 августа 2021 в 03:56
0

Эти предложения идут в ОТ. Я не хочу использовать новый инструмент для чего-то, что я мог бы сделать в виде простого модульного теста.

jmcilhinney
9 августа 2021 в 04:03
1

Это не модульный тест. Вы не должны быть в состоянии сделать это как модульный тест. Тема неправильная, поэтому предложение ОТ. Если вы спросите, как поступить неправильно, не удивляйтесь, если вместо этого люди скажут вам поступать правильно.

Ответы (2)

avatar
DarkTrick
9 августа 2021 в 07:07
0

Единственное решение, которое я нашел, это создать подкласс для каждого элемента управления (виджета), с которым вы хотите работать, и сделать их On*() методы public.

В приведенном ниже коде подклассы a Button позволяют использовать методы OnClick() и OnKeyDown() извне.

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

Примечания относительно KeyDown:

  • Хорошо: вызов OnKeyDown() извне ничего не вызовет, если для Form KeyPreview установлено значение False. Это согласуется с реальными ключевыми событиями и поэтому хорошо.
  • Плохо: ключевые события не будут перенаправлены.
    Рассмотрим Form и Button, имеющие событие KeyDown. Если пользователь нажимает клавишу в фактическом графическом интерфейсе, событие поступает к обоим элементам управления/виджетам. Однако при использовании описанного здесь метода событие будет инициировано только внутри объекта, который был вызван
  • .
avatar
user20210427
9 августа 2021 в 03:51
-2

Можно ли напрямую вызвать функцию OnClick() элемента управления? Достаточно ли этого для вашего теста?

Я помню, что невозможно смоделировать событие, хотя можно вызвать функцию извне. Это случилось и со мной.

DarkTrick
9 августа 2021 в 03:53
0

По-видимому, такие методы объявлены protected и не могут быть запущены извне.