CUTE单元测试无法识别抛出的异常

时间:2011-06-08 13:21:00

标签: c++ unit-testing

使用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的一个问题。我只是不知道关于宏与构造函数代码交互的方式或原因。

1 个答案:

答案 0 :(得分:2)

(咳咳)我认为ASSERT_THROWS宏正在做一些你不知道的事情。而不是

CoarseModelType(COARSE_MODEL_COUNT)

尝试

CoarseModelType dummy(COARSE_MODEL_COUNT)

看看会发生什么。第一种是调用构造函数的奇怪方法,而笨拙的宏可能会将其转换为编译器以不同方式解释的内容。

(注意:您可以使用gcc -E预处理源代码而不编译它,扩展宏以便您可以看到它们正在做什么。)