CUTE单元测试无法识别引发的异常

CUTE unit test not recognizing thrown exception

本文关键字:异常 识别 单元测试 CUTE      更新时间:2023-10-16

使用CUTE单元测试框架,我有以下类:

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是一个宏。

我们在Linux上使用gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)。是否存在某种隐含的转换或我不知道的事情?我们都在为这件事挠头。

编辑:

以下内容确实在单元测试中抛出了一个错误,并被注册为错误而不是失败。在第二个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的一个问题。我只是不知道如何或为什么与构造函数代码进行宏交互。

(Ahem)我认为ASSERT_THROWS宏正在做一些你没有意识到的事情。代替

CoarseModelType(COARSE_MODEL_COUNT)

尝试

CoarseModelType dummy(COARSE_MODEL_COUNT)

看看会发生什么。第一种是调用构造函数的一种奇怪方式,一个笨拙的宏可能会将它变成编译器解释不同的东西。

(注意:您可以使用gcc -E来预处理源代码,而无需编译它,在适当的位置扩展宏,这样您就可以看到它们在做什么。)