2009-07-22 15 views
2

メインプロジェクトのすべてのユニットテストに専用のプロジェクトを構築しています。コードベース。現在、メインプロジェクトのすべてのユニットは、プロジェクトのdprファイルでその場所とともに参照されます。私がクラスのテストケースを書くときは、クラスのユニット参照(および参照されたユニットのユニット参照)をメインプロジェクトのdprからコピーし、ユニットテストプロジェクトに貼り付けます。デルファイ:別のプロジェクトで1つのプロジェクトのすべてのユニットとユニット参照を使用する方法

これは結局、メインプロジェクトのdprファイル単位がそのまま参照するすべてのメインプロジェクトを含むdprファイルに終わることになり、メインプロジェクトdprが変更されたときに維持するのが難しくなります。ここ数千のユニットについて話しています。

私の質問は、どういうわけか、あるプロジェクトのすべてのユニット参照を別のプロジェクトに含めることができますか?メインプロジェクトが1つのディレクトリにdcusをコンパイルし、これをユニットテストプロジェクトに含めるだけでは、実行する必要がある初期化ルーチンがユニットに含まれているため、dcu検索パスでは不十分です。

答えて

2

これを実装する方法は、既存の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

別のオプションは、最初のプログラムは、完全なユニットを生成する必要があり、その後、テストアプリケーションでは、このユニットを使用することです。これは、参照されているすべてのユニットの初期化/終了コードでコンパイルされます。テストアプリケーションは、これらのオブジェクトにアクセスするためには、前述のグローバルリポジトリを使用する必要があります。

ここで重要な点は、テストプロジェクトの検索パスに他のプロジェクトのソースディレクトリが含まれていることを確認することです。

+1

はい、私はこのようなことをすることを考えました。残念ながらコンパイラ指令でそれらを含めることはIDEのプロジェクトの一部にはならず、テストプロジェクトのdprを直接変更するようにあなたのサンプルを修正するかもしれません。 遅延バインディングはありません。初期化コードのためにすべてのユニットを含めたいと思います。私が使用したいグローバルなクラスレジストリがあります。さらに、私は同僚が新しいテストを書くことを容易にしたいと思っています。ユニット参照を扱わなくても、障害物が少なくなるでしょう。 – Ozan

2

いいえ、これを行う方法はありませんが、問題はそれほど重要ではありません。 IDEはDPRを維持しています。物事がどのように参照されているかについては非常に精通しています。インクルードファイルのような他のユニットでうまくいくテクニックは、DPRでは確実に動作しません。 IDEがDPRを変更するような何かをするまでコンパイルされますが、その時点でDPRコードがマングリングされることがあります。

ただし、DPRにすべての参照ファイルを含めることは厳密には必要ではありません。 IDEをもっと楽しく速くするように思えますが、DPRだけがあなたのテストを参照し、メインプロジェクトのユニットを参照したテストでもすべてが機能します。

+0

一方、ユニットが.dpr内にあり、たとえば。間違ったパス、ひどく奇妙なエラーを得ることができます。 –

+0

テストでメインプロジェクトのユニットが参照されると、そのパスでリファレンスを参照する必要があります。これは私が知っている限り、dprでのみ可能です。 – Ozan

+0

いいえ、そうではありません。このためにプロジェクト検索を使用することができます。 –

0

私は常に参照番号を保持します。DPR最小限:VFIの継承に自動インスタンス化形態である

  • ユニットを関与している重要な初期化
  • 単位を有する

    • ユニット。
    • 時々、ctrl-enterを使用してビジネスコードをすばやくナビゲートするための中央ユニットのカップルです。

    可能な限り最小の(相対)パスを常に使用します。

    一般的に問題は1つのみですが、file-> openを使用してユニットを参照すると、現在の作業ディレクトリが壊れてしまい、関連するルートのルートが壊れてしまうことがあります。回避策は、ベースディレクトリ内のユニットのファイル→オープンを行うことです。

  • 関連する問題