gpt4 book ai didi

delphi - DUnit GUI 测试 : Can I force 'Application' to a different "form"?

转载 作者:行者123 更新时间:2023-12-03 15:02:09 25 4
gpt4 key购买 nike

我正在尝试使用 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在测试中创建此框架时声明,但至少在最初,实现此目的似乎也不是那么简单。

最佳答案

您应该创建一个TForm,并将frame.parent 设置为该TForm,而不是解决设置Application.Handle 的方法。

//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 的设计目的并非如此。

关于delphi - DUnit GUI 测试 : Can I force 'Application' to a different "form"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com