2

ビジュアルアプリケーションではよくあることですが、データがビジュアルコンポーネント(TTreeViewコンポーネント)で維持されるコードがあります。コードをリファクタリングし、ロジックの単体テストを作成しています。

私のテストプロジェクトの唯一の視覚的なフォームはGUITestRunnerです。将来的には、継続的インテグレーションサーバーの下でコンソールアプリケーションとしてテストを実行する予定なので、フォームはありません。

親なしでTTreeViewウィジェットを作成して使用しようとすると、次のエラーが発生します。

Control '' has no parent window

テストスイートのSetUpメソッドでウィジェットを作成し、TearDownで破棄するための最良の方法は何ですか?コンソールアプリケーションでビジュアルウィジェットを使用することは可能ですか?表示したり、イベントを処理したりする必要はありません。子ノードを作成してデータにアクセスするだけです。

醜いハックでうまくいくようになりましたが、標準的な方法があるかどうか知りたいです。

確かに、晴れて遠い将来、この21千行の形式のコードをリファクタリングします。すべてのデータは美しいデータ構造になり、この種のテストは必要ありませんが、今は必要です。

4

2 に答える 2

6

You need to create a hidden (i.e. non-visible) window to be the parent. Here is a sample console app that proves that this approach works.

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

In unit tests, you test the core functionality of a unit (which is rather a piece of logic than an actual literal unit-file). GUI is usually not part of this process.

You can however create an invisible form and place invisible controls on it. [edit] See David's answer for a way to do that. [/edit] That way you may be able to test it. And you could use visual controls too. there are even test suites that can test visual controls by running some kind of prerecorded macro that fills in a form and pressed the right buttons.

But in fact this isn't the right way. GUI testing is different from Unit testing. The business logic should be seperated enough from your GUI to be able to test it alone, apart from the GUI and from other 'units'.

And 21 thousand lines isn't so much, is it? Got half a million lines here (alhough I wouldn't like needing to refactoring them either). :) Take it a step at a time. Refactor little pieces and write unit tests for each refactored piece. That way, you can keep your test for the future, because they will be usefull, even when all your code looks great and structured.

于 2011-09-13T20:50:27.097 に答える