新しいユニットを取得したのに「ユニットを使用」が表示されなくなるのはなぜですか?
質問
DUnit フレームワークを使用したアプリケーションの単体テスト プロジェクトがあります。このプロジェクトにはユニットがあり、 $IFDEF
GUI またはコマンドラインの代わりに、テスト結果を XML ファイルに出力します。XML_OUTPUT 定義はビルド構成を切り替えることで有効になります。
program DelphiCodeToDoc_Tests;
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
{$IFDEF XML_OUTPUT}
XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
{$ENDIF}
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
これは完璧に機能します。問題が始まります このプロジェクトに新しいユニットを追加するとき IDE から (「ファイル > 新規 > ユニット」による新しいユニット)。
テスト プロジェクトは次のようになりました。
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
MyNewUnit in 'IntegrationTests\MyNewUnit.pas';
ご覧のとおり、テスト XML_OUTPUT が消えています...ユニットを追加するたびに、Delphi IDE はこのテストを削除します。
その理由と、それを回避する方法を知っていますか?
解決
実際に使用されているだけのコードは、それが使用されていないUses
句の単位を持っていて損はないので、通常、とにかくあなたのアプリケーションにコンパイルされます。
あなたは、あなたのIDE内のプログラムを実行すると、アプリケーションにリンクされているすべてのコードを見ることができます。あなたは、次のコンパイルされたコードの全てに青い点が表示されるはずです。
1の注意点は、あなたが懸念される単位のinitialization
のセクションを確認してくださいということです。アプリケーションが起動するように、そのセクション内の任意のコードがすぐに実行されるため、初期化セクションにある任意のコードが自動的にユニットを含むことにより、単純に含まれています。必要な場合は、中およびRANリンクされているから、任意の初期化コードを避けるために、ユニットの初期化セクション内のコンパイラディレクティブを追加することができます。
他のヒント
あなたは(私たちの多くはバグではなく、機能を考慮して)この問題行動バイパスにメインプログラムにプロキシユニットを追加することができます。
program DelphiCodeToDoc_Tests;
uses
...
XMLTestRunnerProxy,
...
と
unit XMLTestRunnerProxy;
interface
{$IFDEF XML_OUTPUT}
uses
XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
{$ENDIF}
implementation
end.
DPR の 用途 リストはIDEによって管理されます。残念ながら、これに関してできることは何もありません。公式には、IFDEF を DPR の途中に置くことは想定されていません 用途 リストすると、このようなことが行われるためです。
私がやるべきことは、XmlTestRunner2 ユニットをプロジェクト内に残し、ユニット自体の中に IFDEF を配置して、XML_OUTPUT が設定されていない場合は何もコンパイルしないようにすることです。
ストリッピングはIDEがDPRのuses節を変更しなければならいつでも起こります。ユニットの名前を変更するには、「名前を付けて保存」を使用すると、同じことを行います。
これを回避するには、私は常に空のテキストファイルとして外部に私の新しいユニットを作成し、手動でDPRに追加します。これは、最初は少しより多くの仕事だが、彼らがしている必要に応じて、あなただけのユニットを含む終わるん。また、ノートこれが起こるんときに、後のDelphi 2005よりも何かを使用している場合は、編集ペインの一番下にある「履歴」タブに切り替え、前ユニットのバージョンを取得するには、「ローカルファイル」の内容をコピーすることができ追加され、他のすべてが剥奪された。
そして、はい、これはバグです。 QC#6294 に具体的には、それが開いているので、エンバカデロは認識しています問題のます。
は二つのプロジェクトを持つことを検討してください。オプションのコードで一度、1なし。そして、あなたがしたい方、ビルド、またはその両方。プロジェクトグループを使用して、彼らはうまく動作します。