gpt4 book ai didi

c# - 测试使用预处理器常量的代码

转载 作者:行者123 更新时间:2023-12-03 22:19:02 27 4
gpt4 key购买 nike

目前我正在对某个项目进行单元测试,一切都很好,除了开发人员使用这样的地方:

#if USING_EMULATOR
{ do nothing }
#else
{ do a lot of things }
#endif

#if USING_EMULATOR
return;
#endif
{ do a lot of things }

我认为 USING_EMULATOR 下的代码是出于调试目的而完成的。有时也会出现 #if DEBUG。如果现在仅用于调试目的的代码正在尝试执行,我该如何检查实际的代码?#undef USING_EMULATOR 没有帮助。我不太清楚预处理器常量,在 C# 中它们甚至不能只设置定义/未定义,所以也许我只是做错了?

最佳答案

假设您有一定的重构空间,您可以将这些指令提取到私有(private)或 protected 属性中,然后给自己一个 Hook 来修改测试中的值。

您还可以提取对 IRuntimeConfiguration 之类的依赖项,然后您可以将其中的一个 stub 替换为您的测试。

例如:

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 的值。属性(property)。如果您替换为不同的 IRuntimeConfiguration总是返回 false 的实现,您可以像不在 DEBUG 中一样执行代码而不是 USING_EMULATOR即使确实设置了预处理器值。

关于c# - 测试使用预处理器常量的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583868/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com