Тестирование графического интерфейса пользователя DUnit: можно ли принудительно изменить «приложение» на другую «форму»?

Я пытаюсь запустить модульный тест GUI с DUnit для приложения, основная форма которого динамически создает для себя фреймы. Мне удалось создать основную форму приложения для тестирования как форму в тестовом примере и получить доступ к ее пунктам меню и т. Д.

Проблема возникает, когда приложение пытается создать фрейм динамически. Чтение ресурса фрейма доходит до того, что ему нужен дескриптор окна (в моем случае установка заголовка вкладки). Здесь он переходит от TWinControl.GetHandle к TWinControl.CreateWnd и к TCustomFrame.CreateParams.

В этом CreateParams код говорит:

  if Parent = nil then
    Params.WndParent := Application.Handle;

Вот где возникает разница. Когда я запускаю реальное приложение (не в тесте), Application.Handle здесь возвращает ненулевое число, и поток продолжается нормально. Но в тестовом приложении DUnit Application.Handle здесь возвращает 0. Это приводит к тому, что код в TWinControl.CreateWnd вызывает исключение, сообщающее, что у кадра нет родителя:

  with Params do
  begin
    if (WndParent = 0) and (Style and WS_CHILD <> 0) then
      if (Owner <> nil) and (csReading in Owner.ComponentState) and
        (Owner is TWinControl) then
        WndParent := TWinControl(Owner).Handle
      else
        raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);

Я бы хотел попытаться обойти эта проблема (и вообще все тестовые задачи) без изменения "производственного" кода только из-за тестов. Можете ли вы дать какие-либо подсказки о том, могу ли я каким-то образом принудить "Приложение" к чему-то другому или каким-то другим способом обойти это?

Глядя на код, возможный другой сценарий обхода может заключаться в попытке получить владельца ( который является моей «MainForm» тестируемого приложения, т.е. чей дескриптор я хотел бы получить) находиться в состоянии csReading при создании этого фрейма в тесте, но, по крайней мере, изначально это не кажется таким простым для это тоже должно случиться.

6
задан DelphiUser 22 February 2012 в 10:59
поделиться