Как использовать визуальные компоненты в модульных тестах Delphi? - PullRequest
2 голосов
/ 14 сентября 2011

Как обычно бывает в визуальных приложениях, у меня есть некоторый код, в котором данные хранятся в визуальном компоненте (компонент TTreeView). Я рефакторинг кода и создание модульных тестов для логики.

Единственная визуальная форма в моем тестовом проекте - GUITestRunner. В будущем я планирую запускать тесты в виде консольного приложения на сервере непрерывной интеграции, поэтому у меня не будет никакой формы.

Когда я пытаюсь создать виджет TTreeView без родителя и использовать его, я получаю следующую ошибку:

Control '' has no parent window

Какой лучший способ создать виджет в моем методе SetUp набора тестов и уничтожить его в TearDown? Можно ли использовать визуальный виджет в консольном приложении? Мне не нужно отображать его или даже обрабатывать события. Мне просто нужно создать дочерние узлы и получить доступ к данным.

Мне удалось заставить его работать с безобразным хаком, но я хотел бы знать, есть ли какая-то стандартная практика.

Конечно, в моем солнечном и далеком будущем я буду рефакторинг кода этой формы из 21 тысячи строк, все мои данные будут в красивых структурах данных, и такого рода тесты не понадобятся, но теперь мне это нужно .

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011

Вам нужно создать скрытое (то есть невидимое) окно, чтобы быть родителем. Вот пример консольного приложения, которое доказывает, что этот подход работает.

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.
4 голосов
/ 14 сентября 2011

В модульных тестах вы проверяете базовую функциональность модуля (который является скорее частью логики, чем действительным буквальным файлом модуля).GUI обычно не является частью этого процесса.

Однако вы можете создать невидимую форму и разместить на ней невидимые элементы управления. [править] См. Ответ Дэвида, как это сделать.[/ edit] Таким образом, вы сможете протестировать его.И вы можете использовать визуальный контроль тоже.Есть даже наборы тестов, которые могут тестировать визуальные элементы управления, запустив какой-то предварительно записанный макрос, который заполняет форму и нажимает правые кнопки.

Но на самом деле это не правильный путь.Тестирование GUI отличается от модульного тестирования.Бизнес-логика должна быть достаточно отделена от вашего графического интерфейса, чтобы можно было протестировать ее в одиночку, отдельно от графического интерфейса и от других «модулей».

И 21 тысяча строк - это не так много, не так ли?Здесь получилось полмиллиона строк (хотя мне бы не хотелось их рефакторинга).:) Сделайте шаг за шагом.Рефакторинг маленьких кусочков и запись юнит-тестов для каждого переработанного кусочка.Таким образом, вы можете сохранить свой тест на будущее, потому что они будут полезными, даже когда весь ваш код выглядит великолепно и структурировано.

...