リファクタリングの自由度があると仮定すると、これらのディレクティブをプライベートまたは保護されたプロパティに抽出し、テストで値を変更するためのフックを自分自身に与えることができます。
のようなものへの依存関係を抽出することもできます。その依存関係IRuntimeConfiguration
をテストのスタブに置き換えることができます。
例えば:
public class ClassIAmTesting
{
private readonly IRuntimeConfiguration _runtimeConfig;
public ClassIAmTesting(IRuntimeConfiguration runtimeConfig)
{
_runtimeConfig = runtimeConfig;
}
public void MethodIWantToTest()
{
if(_runtimeConfig.IsDebug)
return;
// …
}
}
public interface IRuntimeConfiguration
{
bool IsDebug { get; }
bool IsUsingEmulator { get; }
}
public class RuntimeConfiguration : IRuntimeConfiguration
{
public bool IsDebug
{
get
{
return
#if DEBUG
true;
#else
false;
#endif
}
}
// repeat for IsUsingEmulator
}
このように、実行するコードの「選択」は、プリプロセッサ ディレクティブに基づくのではなく、通常のbool
プロパティの値に基づきます。IRuntimeConfiguration
常に を返す別の実装に置き換えると、プリプロセッサの値が実際に設定されている場合でも、ないかのfalse
ようにコードを実行できます。DEBUG
USING_EMULATOR