我有一个看起来像这样的函数:
std::string SomeClass::convertStateToString(StateE state) const
{
std::string stateAsString;
switch (state)
{
case UNKNOWN:
stateAsString = "UNKNOWN";
break;
case OFFLINE:
stateAsString = "OFFLINE";
break;
case ENABLED:
stateAsString = "ENABLED";
break;
case DISABLED:
stateAsString = "DISABLED";
break;
default:
stateAsString = "ABNORMAL";
break;
}
return stateAsString;
}
其中StateE定义为:
typedef enum
{
UNKNOWN = 0,
OFFLINE = 1,
ENABLED = 2,
DISABLED = 3
} StateE;
出于单元测试的目的,我想将一些不良数据提供给convertStateToString
,并验证我得到"ABNORMAL"
。这可能吗?
换句话说,是否可以将枚举范围之外的值作为in-parameter传递给函数的签名表示参数属于枚举类型的函数?
在尝试了指针和reinterpret_cast
之后,我几乎准备声称函数convertStateToString
在任何情况下都不能返回"ABNORMAL"
。
没有方法太过于苛刻!
答案 0 :(得分:2)
您可以在单元测试中写下这个:
convertStateToString(static_cast<StateE>(10));
这将强制您的代码传入&#34;默认&#34;你的开关/箱子。
答案 1 :(得分:1)
无论C ++尝试执行正确的类型检查的方式有多少, 它仍然可以只取内存位置的地址并更改其内容。 例如:声明一个StateE类型的变量,获取其地址,在其中写入一个超出范围的值,然后将其传递给该函数。 可能变量应该是易变的。
答案 2 :(得分:1)
我没有看到问题:
std::string convertStateToString(StateE state);
int main() {
std::cout << convertStateToString(StateE(30)) << "\n";
}
输出:
ABNORMAL