假设您有一定的重构空间,您可以将这些指令提取到私有或受保护的属性中,然后给自己一个挂钩来修改测试中的值。
您还可以提取对类似 的依赖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
预处理器值确实设置了。