2

有时在可视化应用程序中很常见,我有一些代码将数据保存在可视化组件(TTreeView 组件)中。我正在重构代码并为逻辑创建单元测试。

我的测试项目中唯一的可视形式是 GUITestRunner。将来我计划在持续集成服务器下将测试作为控制台应用程序运行,所以我不会有任何形式。

当我尝试创建没有父级的 TTreeView 小部件并使用它时,我收到以下错误:

Control '' has no parent window

在我的测试套件 SetUp 方法上创建小部件并在 TearDown 中销毁它的最佳方法是什么?是否可以在控制台应用程序中使用可视小部件?我不需要显示它,甚至不需要处理事件。我只需要创建子节点并访问数据。

我设法使它与一个丑陋的黑客一起工作,但我想知道是否有一些标准做法。

当然,在我阳光明媚且遥远的未来,我会重构这个 21000 行表格的代码,我所有的数据都将在漂亮的数据结构中,这些测试将不是必需的,但现在我需要它。

4

2 回答 2

6

您需要创建一个隐藏(即不可见)窗口作为父窗口。这是一个示例控制台应用程序,它证明了这种方法有效。

program HiddenWindow;

{$APPTYPE CONSOLE}

uses
  SysUtils, Forms, StdCtrls;

var
  Form: TForm;

begin
  Form := TForm.Create(Application);
  with TListBox.Create(Form) do begin
    Parent := Form;
    Items.Add('test');//fails if the parent is not set
  end;
end.
于 2011-09-13T20:49:43.303 回答
4

在单元测试中,您测试一个单元的核心功能(这是一段逻辑,而不是实际的文字单元文件)。GUI 通常不是这个过程的一部分。

但是,您可以创建一个不可见的表单并在其上放置不可见的控件。[编辑] 请参阅大卫的答案以了解如何做到这一点。[/edit] 这样你就可以测试它了。你也可以使用视觉控制。甚至还有一些测试套件可以通过运行某种预先录制的宏来测试可视化控件,该宏会填写表格并按下正确的按钮。

但实际上这不是正确的方法。GUI 测试不同于单元测试。业务逻辑应该与您的 GUI 足够分离,以便能够单独测试它,除了 GUI 和其他“单元”。

21000行也不算多吧?这里有 50 万行(尽管我也不想重构它们)。:) 一步一步来。重构小块并为每个重构块编写单元测试。这样,您可以保留您的测试以备将来使用,因为它们很有用,即使您的所有代码看起来都很棒且结构化。

于 2011-09-13T20:50:27.097 回答