4

嘿,我在 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;

演示项目:这里

4

3 回答 3

5

您所做的更像是功能或集成测试。您正在检查您的 UI 是否设置正确。这种测试不同于单元测试。

单元测试应该检查如果你给一个模块某些输入,那么它们会产生某些输出。单元测试是本地化的。它们旨在独立于其他单元测试一个单元的行为。UI 特别依赖于其他单元。它们从输入设备获取数据并在数据库上进行操作,并且总体上具有相当复杂的依赖关系。这使它们成为单元测试的糟糕目标。

看看这个问题 -单元测试与功能测试

要进行所需的测试,最好制作自己的工具来正确设置环境并执行测试。

于 2014-03-16T21:46:26.970 回答
2

错误消息指出了问题。如果您需要一个 MDI 子窗体,它必须有一个 MDI 父窗体。并且该父表单必须是您程序的主要表单。在 DUnit 项目中很难实现。您的解决方案似乎是:

  • 使程序的主窗体成为 MDI 主窗体。我认为这将很难实现。
  • 使您的被测表单不是 MDI 子表单。
  • 找到一种不需要实例化此表单的测试方法。
于 2014-03-16T20:09:57.287 回答
1

我遇到了同样的问题,我决定实施 David Heffernan 的建议和“让你的被测表单不是 MDI 子表单”。

在这里,我将描述如何实现这一目标。我已经在我的测试用例单元中进行了所有更改。

  1. 制作继承原始MDI子表单的测试表单

    type TTestCustomerCard = class(TCustomerCard) end;

    在您的测试用例类之前添加它。

  2. 将 dfm 文件或表格(例如 CustomerCard.dfm)复制到 TestCustomerCard.dfm

  3. 在任何文本编辑器中打开 TestCustomerCard.dfm,删除行

    FormStyle = fsMDIChild因为 fsNormal 是默认值),

    改变第一行 object CustomerCard: TCustomerCard

    object TestCustomerCard: TTestCustomerCard

  4. 添加指令 {$R TestCustomerCard.dfm }

  5. 在您的 SetUp 方法中,而不是

    FCustomerCard := TCustomerCard.Create(Application);

    FCustomerCard := TTestCustomerCard.CreateNew(Application); InitComponentRes( 'TTESTCUSTOMERCARD', FCustomerCard );

于 2017-11-02T10:38:05.600 回答