使用CUTE unit test framework我有以下类:
const std::size_t COARSE_MODEL_COUNT = 4;
class ModelType
{
public:
explicit ModelType(std::size_t aModelNumber) : theModelNumber(aModelNumber){}
virtual operator size_t(){ return theModelNumber; }
protected:
std::size_t theModelNumber;
};
class CoarseModelType : public ModelType
{
public:
explicit CoarseModelType(std::size_t aModelNumber) : ModelType(aModelNumber)
{
if (COARSE_MODEL_COUNT <= aModelNumber)
{
throw std::invalid_argument("Invalid model number selected for \
this model type.");
}
}
};
进行以下单元测试:
void ModelTypeTest::testCoarseModelConstructor()
{
//greater than test
ASSERT_THROWS(CoarseModelType(COARSE_MODEL_COUNT+1), std::invalid_argument);
//equal to
ASSERT_THROWS(CoarseModelType(COARSE_MODEL_COUNT), std::invalid_argument);
}
如果我注释掉第二个ASSERT_THROWS
单元测试正确通过。如果我把它留在里面就失败了。我认为在<=
类型上使用std::size_t
运算符会识别==
组件,但事实并非如此。 ASSERT_THROWS
是一个宏。
我们使用gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
在Linux上。是否存在某种隐式转换或者我不知道的事情?我们都在这个问题上摸不着头脑。
修改
以下操作会在单元测试中抛出错误,并将其注册为错误而非失败。在第二个ASSERT_THROWS
语句有可能失败之前抛出异常:
void ModelTypeTest::testCoarseModelConstructor()
{
//greater than test
ASSERT_THROWS(CoarseModelType(COARSE_MODEL_COUNT+1), std::invalid_argument);
if(COARSE_MODEL_COUNT <= COARSE_MODEL_COUNT){
throw std::invalid_argument("wtf");
}
//equal to
ASSERT_THROWS(CoarseModelType(COARSE_MODEL_COUNT), std::invalid_argument);
}
所以这是CUTE的一个问题。我只是不知道关于宏与构造函数代码交互的方式或原因。
答案 0 :(得分:2)
(咳咳)我认为ASSERT_THROWS
宏正在做一些你不知道的事情。而不是
CoarseModelType(COARSE_MODEL_COUNT)
尝试
CoarseModelType dummy(COARSE_MODEL_COUNT)
看看会发生什么。第一种是调用构造函数的奇怪方法,而笨拙的宏可能会将其转换为编译器以不同方式解释的内容。
(注意:您可以使用gcc -E
预处理源代码而不编译它,扩展宏以便您可以看到它们正在做什么。)