DUnit GUI Testing: Могу ли я заставить «приложение» в другой «форме»? - PullRequest
6 голосов
/ 22 февраля 2012

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

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

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

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

Вот где возникает разница.Когда я запускаю реальное приложение (не в тесте), Application.Handle здесь возвращает ненулевое число, и процесс продолжается нормально.Но в тестовом приложении DUnit Application.Handle возвращает 0Я хотел бы попытаться обойти эту проблему (и вообще все тестовые проблемы) без изменения «производственного» кода только из-за тестов.Можете ли вы дать какие-либо подсказки о том, могу ли я каким-либо образом принудить «Приложение» к чему-то другому или как-то обойти это?владелец (который является моей «MainForm» приложения для тестирования, т. е. чей дескриптор я бы хотел получить) находился в состоянии csReading при создании этого кадра в тесте, но, по крайней мере, изначально это не кажетсятак просто сделать это тоже.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Вместо того, чтобы обойти способ установки Application.Handle, вы должны создать TForm и установить в качестве frame.parent именно эту TForm.

//Dunit Test Scaffolding code...Set up a workable environment for the test:
aForm := TForm.Create(nil);
aFrame := TFrame.Create(aForm);
aFrame.Parent := aForm;

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

0 голосов
/ 23 февраля 2012

Спасибо за все комментарии и ответы!Я считаю, что решил проблемы, по крайней мере, те, которые выяснили до сих пор.Ниже я приведу свои выводы и окончательную ситуацию (на случай, если кто-то еще сочтет это полезным).

У меня есть тестовый класс декоратора, унаследованный от TTestSetup, который содержит ссылку на фиктивную (основную) формукоторый он создает при необходимости.

Я также нашел способ переключения Application.MainForm во время выполнения, используя такой подход: http://www.swissdelphicenter.ch/torry/showcode.php?id=665

В методе SetUp тестового декоратора я сначала создаю фиктивныйформы, а затем установите его в качестве основной формы приложения (здесь этот параметр может не потребоваться).

Затем у меня есть класс тестового случая (унаследованный от TGUITestCase), чьи SetUp и TearDown запускаются для каждого теста,В этом SetUp я создаю основную форму, которую я тестирую, а затем устанавливаю ее в качестве основной формы приложения.Затем, после теста в TearDown тестового примера, я снова установил фиктивную форму в качестве основной формы Приложения, и только после этого вызова Close и Free обращаюсь к основной форме, которую я тестирую.В противном случае освобождение формы, которая в данный момент является Application.MainForm, приведет к завершению всего приложения DUnit.

...