嘿,我在Delphi XE3中的单元测试有问题我有一个项目,包含1个MDIForm和分配MDIChild表单然后问题是当我在MDIChild表单上运行测试时出现此错误:
TestAllDataSrouces: EInvalidOperation
at $0064346F
SetUp FAILED: Cannot create form. No MDI forms are currently active
我的安装方法如下所示:
procedure TestTCustomerCard.SetUp;
begin
FCustomerCard := TCustomerCard.Create(Application);
end;
我该怎么做才能解决这个错误?到目前为止我试过了:
FCustomerCard := TCustomerCard.Create(Application.MainForm);
FCustomerCard := TCustomerCard.Create(nil);
和
procedure TestTCustomerCard.SetUp;
var
a : TForm;
begin
a := TForm.Create(nil);
a.FormStyle := fsMDIForm;
FCustomerCard := TCustomerCard.Create(a);
end;
我的测试是:
procedure TestTCustomerCard.TestAllDataSrouces;
var
I: Integer;
begin
for I := 0 to FCustomerCard.ComponentCount-1 do
begin
if (FCustomerCard.Components[i] is TcxLookupComboBox) then
begin
Check(TcxLookupComboBox(FCustomerCard.Components[i]).Properties.ListSource = nil,'Error no ListSource, Lookup: '+TcxLookupComboBox(FCustomerCard.Components[i]).Name+' Parent: '+TcxLookupComboBox(FCustomerCard.Components[i]).Parent.Name);
end;
if (FCustomerCard.Components[i] is TcxDBTextEdit) then
begin
Check(TcxDBTextEdit(FCustomerCard.Components[i]).DataBinding.DataSource = nil,'Error No DataSet, Text Edit: '+TcxDBTextEdit(FCustomerCard.Components[i]).Name+' Parent: '+TcxDBTextEdit(FCustomerCard.Components[i]).Parent.Name);
end;
if (FCustomerCard.Components[i] is TcxGridDBTableView) then
begin
Check(TcxGridDBTableView(FCustomerCard.Components[i]).DataController.DataSource = nil,'Error no Data Source, DB Grid View: '+TcxGridDBTableView(FCustomerCard.Components[i]).Name);
end;
end;
end;
演示项目:Here
答案 0 :(得分:5)
您正在做的更像是功能测试或集成测试。您正在检查您的UI是否已正确设置。这种测试与单元测试不同。
单元测试应该检查如果给模块某些输入,那么它们会产生某些输出。单元测试已本地化。它们旨在独立于其他单元测试单元的行为。 UI特别依赖于其他单位。它们从输入设备获取数据并在数据库上操作,并且总体上具有相当复杂的依赖性集。这使得它们成为单元测试的不良目标。
看看这个问题 - Unit tests vs Functional tests
要进行您想要的测试,最好制作一个可以正确设置环境并执行测试的工具。
答案 1 :(得分:2)
错误消息指出了问题。如果您需要MDI子表单,则必须具有MDI父表单。并且该父表单必须是您程序的主要形式。很难在DUnit项目中实现。您的解决方案似乎是:
答案 2 :(得分:1)
我遇到了同样的问题,我决定实施David Heffernan的建议和#34;让你的表格不受MDI子表格的影响"。
在这里,我将描述如何实现这一目标。我在我的测试用例单元中进行了所有更改。
制作继承原始MDI子表单的测试表单
type TTestCustomerCard = class(TCustomerCard) end;
在测试用例类之前添加它。
将dfm文件或表单(例如CustomerCard.dfm)复制到TestCustomerCard.dfm
在任何文本编辑器中打开TestCustomerCard.dfm,删除行
FormStyle = fsMDIChild
(因为fsNormal是默认值),
改变第一行
object CustomerCard: TCustomerCard
要
object TestCustomerCard: TTestCustomerCard
添加指令
{$R TestCustomerCard.dfm }
在您的SetUp方法中,而不是
FCustomerCard := TCustomerCard.Create(Application);
写
FCustomerCard := TTestCustomerCard.CreateNew(Application);
InitComponentRes( 'TTESTCUSTOMERCARD', FCustomerCard );