Я пытаюсь запустить модульный тест 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 при создании этого фрейма в тесте, но, по крайней мере, изначально это не кажется таким простым для это тоже должно случиться.