delphi – DUnit GUI测试:我可以强制’应用’到不同的“形式”
我正在尝试使用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不是为此而设计的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |