Delphi IDE を使用している場合、さまざまなプロパティのフィールドまたはテーブル リストに値を設定するときに、SQLConnection.Connected が "true" に自動的に変更されます。
Connected = true でリリースしたくないので、dfm で TSQLConnection.Connected が true のままになっているときに、dunit テストが失敗するようにする必要があります。
GExpertsには、コンパイルのたびにデータベース接続を閉じるように構成する「コンポーネントプロパティの設定」エキスパートがあります。それ以来、問題は発生していません。
Connected プロパティを格納しない TSQLConnection の独自の子孫を作成できます。
TdzAdoConnection = class(TADOConnection)
published
property Connected stored false;
end;
TSqlConnection ではなくそのコンポーネントを使用します。
(上記は TAdoConnection の場合ですが、TSQLConnection でも問題なく動作するはずです。)
これを別の方法で解決します。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;
OpenCTF - Delphi のコンポーネント テスト フレームワークは興味深いかもしれません。すべてのフォーム/データ モジュールのすべてのコンポーネントの指定されたプロパティの単体テストを自動的に作成します。オープンソースで使いやすいです。
「はじめに」ドキュメント: http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf
OpenCTF コンポーネント テスト フレームワークは、Delphi アプリケーション内のすべての(ビジュアルおよび非ビジュアル)VCL コンポーネントの自動テストを構築するのに役立ちます。DUnit フレームワークに基づいています。
いくつかの使用例:
この問題に対する別のアプローチは、SCM に pre-commit フックを実装することです。私は TortoiseSVN を使用しており、侵入を防ぐために同様のことを行っています。たとえば、IDE で開いた任意のフォームに約 12 個のスキン ユニットを追加しようとする「スキン」ライブラリがあります。(この動作を「修正」するレジストリ パッチがありますが、開発者がコンポーネントを再インストールすると、時々「元に戻す」ことができます)。そのため、SVN pre-commit フックにある .ini ファイルに「禁止された文字列リスト」があります。
私たちの環境では、すべての製品コードは専用の「ビルド マシン」でビルドされるため、コードがチェックインされない場合、ビルドに組み込まれません。問題が解決しました。