加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – DUnit GUI测试:我可以强制’应用’到不同的“形式”

发布时间:2020-12-15 09:51:02 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用DUnit对一个应用程序进行GUI单元测试,该应用程序的mainform动态地为自己创建帧.我已经能够在测试用例中创建应用程序到测试的mainform作为表单并访问其菜单项等. 当应用程序尝试动态创建框架时,问题就出现了.框架的资源读取到了需要窗口句柄的
我正在尝试使用DUnit对一个应用程序进行GUI单元测试,该应用程序的mainform动态地为自己创建帧.我已经能够在测试用例中创建应用程序到测试的mainform作为表单并访问其菜单项等.

当应用程序尝试动态创建框架时,问题就出现了.框架的资源读取到了需要窗口句柄的位置(在我的例子中,设置标签页的标题).它从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不是为此而设计的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读