我正在尝试使用 DUnit 对其主窗体为其自身创建动态框架的应用程序运行 GUI 单元测试。我已经能够将应用程序测试的主窗体创建为测试用例中的窗体并访问其菜单项等。
当应用程序尝试动态创建框架时,问题就出现了。框架的资源读取达到需要窗口句柄的程度(在我的情况下,设置选项卡表的标题)。这里它从 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 状态这个框架在测试中创建,但至少最初看起来也不是那么简单。