8

Delphi IDE を使用している場合、さまざまなプロパティのフィールドまたはテーブル リストに値を設定するときに、SQLConnection.Connected が "true" に自動的に変更されます。

Connected = true でリリースしたくないので、dfm で TSQLConnection.Connected が true のままになっているときに、dunit テストが失敗するようにする必要があります。

4

5 に答える 5

9

GExpertsには、コンパイルのたびにデータベース接続を閉じるように構成する「コンポーネントプロパティの設定」エキスパートがあります。それ以来、問題は発生していません。

于 2009-01-19T16:45:53.753 に答える
5

Connected プロパティを格納しない TSQLConnection の独自の子孫を作成できます。

  TdzAdoConnection = class(TADOConnection)
  published
    property Connected stored false;
  end;

TSqlConnection ではなくそのコンポーネントを使用します。

(上記は TAdoConnection の場合ですが、TSQLConnection でも問題なく動作するはずです。)

于 2009-01-19T15:46:54.543 に答える
4

これを別の方法で解決します。DFM ファイルをロードし、存在しないはずのプロパティを探す小さなユーティリティを作成しました。database.connected = true 値を含めます。

これは、適切なプロパティで動作するように変更できます。コードのコアもここに置きました。

これを本当に便利にするには、ビルド スクリプトでこのユーティリティを使用する必要があります (私は FinalBuilder を使用しています)。私のスクリプトは、まず .dfm ファイルをループし、これらのプロパティを削除してから、コンパイルして単体テストを実行します。パスした場合は、メイン アプリケーションのビルドを続行します。私にとって、これはユニットテストが失敗するよりも良い方法です。保証された既知の良い点から始めることができるからです。

nState := 0;
bFound := False;
for nFileLoop := 0 to memoFile.Lines.Count - 1 do
begin
  szLine := memoFile.Lines[nFileLoop];

  case nState of      //
  0:
     begin
        if(0 <> Pos('TADOConnection', szLine)) then
        begin
           szSeeking := 'Connected';
           nState := 1;
        end
        else if(0 <> Pos('TADOTable', szLine)) then
        begin
           szSeeking := 'Active';
           nState := 1;
        end
        else if(0 <> Pos('TADOQuery', szLine)) then
        begin
           szSeeking := 'Active';
           nState := 1;
        end
        else if(0 <> Pos('TDBISAMTable', szLine)) then
        begin
           szSeeking := 'Active';
           nState := 1;
        end
        else if(0 <> Pos('TDBISAMDatabase', szLine)) then
        begin
           szSeeking := 'Connected';
           nState := 1;
        end
        else if(0 <> Pos('TDBISAMSession', szLine)) then
        begin
           szSeeking := 'Active';
           nState := 1;
        end
        else if(0 <> Pos('TDBISAMQuery', szLine)) then
        begin
           szSeeking := 'Active';
           nState := 1;
        end;
     end;
  1 :
     begin
        bFound := True;
        if(0 <> Pos('end', szLine)) then
        begin
           nState := 0;
        end
        else if(0 <> Pos(szSeeking, szLine)) then
        begin
           nPos := Pos('=', szLine);
           if nPos > 0 then
           begin
              memoFile.Lines[nFileLoop] := Copy(szLine, 1, nPos) + ' False';
           end;
        end;
     end;
  end;      // case
end;
于 2009-01-19T12:19:51.590 に答える
1

OpenCTF - Delphi のコンポーネント テスト フレームワークは興味深いかもしれません。すべてのフォーム/データ モジュールのすべてのコンポーネントの指定されたプロパティの単体テストを自動的に作成します。オープンソースで使いやすいです。

「はじめに」ドキュメント: http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf

OpenCTF コンポーネント テスト フレームワークは、Delphi アプリケーション内のすべての(ビジュアルおよび非ビジュアル)VCL コンポーネントの自動テストを構築するのに役立ちます。DUnit フレームワークに基づいています。

いくつかの使用例:

  • プロパティ値の欠落または誤りを検出する - 例: アクションが割り当てられていないボタン、関連する DataSet がない DataSource
  • 割り当てられていないイベント ハンドラーを検出する - 例: OnExecute イベントの欠落
  • すべての DataSet を開くことができることを確認します
  • タブオーダーを確認する
  • 非表示のコンポーネントを見つける (例: 実行時に非表示にする方がよい非表示のタブシート)

OpenCTF http://www.mikejustin.com/images/OpenCTF.gif

于 2010-03-14T16:58:11.370 に答える
0

この問題に対する別のアプローチは、SCM に pre-commit フックを実装することです。私は TortoiseSVN を使用しており、侵入を防ぐために同様のことを行っています。たとえば、IDE で開いた任意のフォームに約 12 個のスキン ユニットを追加しようとする「スキン」ライブラリがあります。(この動作を「修正」するレジストリ パッチがありますが、開発者がコンポーネントを再インストールすると、時々「元に戻す」ことができます)。そのため、SVN pre-commit フックにある .ini ファイルに「禁止された文字列リスト」があります。

私たちの環境では、すべての製品コードは専用の「ビルド マシン」でビルドされるため、コードがチェックインされない場合、ビルドに組み込まれません。問題が解決しました。

于 2011-11-01T18:52:06.597 に答える