少しハックですが、これが最もシンプルで明確なアプローチだと思います。次の条件付きコンパイル ディレクティブを使用します。
{$IfNDef TEST}
private
{$EndIf}
単体テスト プロジェクトでは、 で TEST を定義する必要がありますproject → conditional defines
。可視性の指定がない場合、それらは公開されます。
注意: プライベート可視性がクラス宣言の最初のものでない場合、以前の定義が取得されます。より安全な方法ですが、より冗長で明確ではありません。
private
{$IfDef TEST}
public
{$EndIf}
これには、サブクラス化やその他のアプローチよりも多くの利点があります。
- 余分な複雑さはありません: コードに余分なクラスはありません。
- 誰も「誤って」サブクラス化してクラスをオーバーライドすることはできません。アーキテクチャを保持します。
- メソッドが保護されていると言うとき、それがオーバーライドされることをいくらか期待します。あなたのコードを読んでいる人にこれを伝えています。オーバーライドされるべきではない保護されたメソッドは、コード リーダーを混乱させ、私の最初のプログラミング原則を破ります。
- DUnit は独自のユニットにあり、どこにも含まれていません。
- 乱雑な RTTI には触れません。
それはより明確な解決策であり、選択した回答よりも優れていると思います。
これを使用するときは、メイン プロジェクトの別のディレクトリにビルド オブジェクトを配置するようにテスト プロジェクトも構成します。これにより、TEST ディレクティブを含むバイナリが他のコードと混ざるのを防ぎます。