これを実装する方法は、既存のDPRファイルを取得し、テストアプリケーションで使用するインクルードファイルを生成するプログラムを作成することです。あなたはおそらくtStringlistを使ってこれを行うことができます。このプロジェクトは、テストケースを構築する前に実行されます。
var
OrigDpr : tStringlist;
begin
OrigDpr := tSTringlist.create;
OrigDpr.LoadFromFile(originalprojectname);
while (OrigDpr.Count > 0) and (not SameText('uses',OrigDpr.Strings[0])) do
OrigDpr.Delete(0);
// delete the uses line.
if (OrigDpr.Count > 0) then
OrigDpr.Delete(0);
while (OrigDpr.Count > 0) and
(not SameText('{$R *.RES}',OrigDpr.Strings[OrigDpr.Count-1]) do
OrigDpr.Delete(OrigDpr.Count-1);
// delete the $R reference
if (OrigDpr.Count > 0) then
OrigDpr.Delete(OrigDpr.Count-1);
OrigDpr.SaveToFile('pathtotestproject\TESTPROJECT.INC');
end;
次に、テスト用のDPRで、project uses句に次のコードを追加します。 uses節は、ファイルが既にセミコロンが含まれて含まれているため、通常の試験ユニットの最後にインクルードファイルを使用する:
USES
// test units go FIRST
{$I pathtotestproject\TESTPROJECT.INC}
私の仮定は、あなたが後半/ゆるい本の理由すべてである、結合実行しているということです最初は必要である(ユニットはDPR内にある以外には参照されない)。それ以外の場合は、いずれかのユニットを使用するだけで、初期化コードを実行するのに十分です。
EDIT
別のオプションは、最初のプログラムは、完全なユニットを生成する必要があり、その後、テストアプリケーションでは、このユニットを使用することです。これは、参照されているすべてのユニットの初期化/終了コードでコンパイルされます。テストアプリケーションは、これらのオブジェクトにアクセスするためには、前述のグローバルリポジトリを使用する必要があります。
ここで重要な点は、テストプロジェクトの検索パスに他のプロジェクトのソースディレクトリが含まれていることを確認することです。
はい、私はこのようなことをすることを考えました。残念ながらコンパイラ指令でそれらを含めることはIDEのプロジェクトの一部にはならず、テストプロジェクトのdprを直接変更するようにあなたのサンプルを修正するかもしれません。 遅延バインディングはありません。初期化コードのためにすべてのユニットを含めたいと思います。私が使用したいグローバルなクラスレジストリがあります。さらに、私は同僚が新しいテストを書くことを容易にしたいと思っています。ユニット参照を扱わなくても、障害物が少なくなるでしょう。 – Ozan